Firemonkey иroid read_phone_state разрешение за време на работа изисква IMEI - Android, delphi, разрешения, firemonkey, delphi-10.2-tokyo

Как мога да получа разрешение read_phone_state по време на изпълнение, за да получа IMEI номер?

  if not HasPermission("android.permission.READ_PHONE_STATE") then
begin

//ASK AND GET PERMISSION ?

end;


function TForm1.HasPermission(const Permission: string): Boolean;
begin
//Permissions listed at http://d.android.com/reference/android/Manifest.permission.html
{$IF RTLVersion >= 30}
Result := TAndroidHelper.Context.checkCallingOrSelfPermission(
{$ELSE}
Result := SharedActivityContext.checkCallingOrSelfPermission(
{$ENDIF}
StringToJString(Permission)) =
TJPackageManager.JavaClass.PERMISSION_GRANTED;


end;

Отговори:

3 за отговор № 1

РЕДАКТИРАНЕ:Съжалявам, че не направих малко повече домашна работа на FireMonkey. Това е, което получавам, задето си приковавам главата в теми, в които не принадлежи. Аз добавих това съдържание, за да опитам да отговоря на моя отговор за по-голяма заслуга на наградата.

Ако можете да ограничите targetSdk в приложението, което се показва до 22 (5.1 Lollipop), тогава потребителят ще трябва да даде разрешение за инсталиране така HasPermission никога не трябва да върне фалшива. (Не сте сигурни как работи това с FireMonkey).

Ако искате да използвате възможностите за динамично разрешение в Marshmallow +, ето някои от информацията, която получих от тази страница:

Трябва да имате достъп до Activity метод за обратно извикване onRequestPermissionsResult, Ето всички обръчи, които ще трябва да прескочите:

  • Използвайте инструмента с отворен код Dex2Jar, за да преобразувате Android classes.dex файл от Delphi обратно към Java, така че можете да компилирате срещу FMXNativeActivity клас.
  • Кодирайте подклас от FMXNativeActivity в Java, който определя a native метод (нека го наречем onRequestPermissionsResultNative и също така има предимство пред onRequestPermissionsResult метод за извикване към естествения метод.
  • тичам javac за да получите файл .class с подклас
  • тичам jar да поставите файла .class в .jar файл
  • тичам dx.bat за да превърнете .jar файла в файл с Android .dex
  • тичам DexMerger , за да обедините .dex файла във файла class.dex на Delphi
  • Сега всичко, което остава да направите, е да напишете някакъв труден код на Делфи, за да дефинирате вашите onRequestPermissionsResultNative и го регистрирайте в JNI Environment. О, и не забравяйте да преминете към правилната нишка в родния си метод.

Връзката, която споменах, показва как да направите това onActivityResult, Ще трябва да адаптирате тези стъпки за другия метод.

И аз дори не съм говорил за това как да се справя с операционната система на пауза на приложението ви, за да поиска от потребителя разрешение и да го възобнови след това.

Нека това да бъде урок за всички: Не влагайте вярата си в платформени инструменти, ще бъдете разочаровани.


Аз работя в Java не Delphi, така че ще трябва да екстраполирам малко тук.

Подобно на вас, трябва да получа IMEI номер исистемният диалогов прозорец пита потребителя като: "Разрешаване на приложението да прави и управлява телефонни обаждания?" Трябва да обясня на потребителя, че това приложение просто получава идентификационния номер на устройството и няма да прави телефонни обаждания.

  • Проверете дали имате разрешение
  • Ако нямате разрешение, проверете дали трябва да покажете обяснение
  • Ако нямате нужда от обяснение, стартирайте операцията за получаване на разрешение

Трябва да спомена това shouldShowRequestPermissionRationale и requestPermissions са методи на Activity клас.

    private static final int READ_PHONE_STATE_PERMISSIONS_REQUEST = 2;

private boolean mHasReadRationale;

void doPermissionsStuff() {
// version checking code omitted, this block runs for marshmallow and later
if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
// do the operation that needs the permission here
} else {
// the flag indicates if the rationale dialog has already been displayed
if (! mHasReadRationale && shouldShowRequestPermissionRationale(Manifest.permission.READ_PHONE_STATE)) {
// pop a dialog that explains what"s going on to the user
} else {
requestPermissions(new String[] {Manifest.permission.READ_PHONE_STATE}, READ_PHONE_STATE_PERMISSIONS_REQUEST);
}
}
}

В положителния бутон на този диалогов прозорец (т.е. потребителят иска да продължи) задайте mHasReadRationale флагът е вярно и се обажда doPermissionsStuff отново. (За отмяна изпращам потребителя обратно на предишния екран.)

За да получите резултата от requestPermissions трябва да преименувате ActivityonRequestPermissionsResult метод:

private boolean mPermissionDenied;

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

switch (requestCode) {
case READ_PHONE_STATE_PERMISSIONS_REQUEST:
// I"m only checking for one permission, so I make assumptions here
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// you can do the operation that needs the permission now
} else {
mPermissionDenied = true;  // set a flag for checking later
}
}
}

Очевидно, когато системата пита потребителя заразрешение, то спира приложението ви, за да не можете да покажете потребителски интерфейс в този момент, за да кажете на потребителя, който нямате разрешение. Затова зададох флаг и когато се възобнови приложението, тогава Казвам на потребителя, че приложението няма разрешение да извърши операцията.

@Override
protected void onResumeFragments() {
super.onResumeFragments();
if (mPermissionDenied) {
// show dialog to the user that the app can"t do the operation because it doesn"t have permission
mPermissionDenied = false;
}
}

Така че тук е пример за поток:

  • Потребителят иска безплатна пробна версия и приложението трябва да получи IMEI, така че да не може да продължи да получава безплатния пробен отново и отново, jeez. doPermissionsStuff(),
  • Приложения за приложения checkSelfPermission() и определя, че разрешението все още не е прието
  • Приложения за приложения shouldShowRequestPermissionRationale(), Според моя опит, shouldShowRequestPermissionRationale() връща само вярно, след като потребителят откаже разрешението веднъж. Така че все още не показвате потребителския интерфейс на потребителя.
  • Приложения за приложения requestPermissions()
  • Системата ще поиска от потребителя "Разрешаване на приложението да прави и управлява телефонни обаждания?"
  • Потребителят реши, че това е WAAAAAAY твърде страшно и натиска бутона No.
  • onRequestPermissionsResult() се нарича с отрицателния резултат и mPermissionDenied се задава.
  • onResumeFragments() ще се обади и ще се покаже диалогов прозорец за потребителя, че не може да получи безплатния пробен период, защото приложението няма разрешение.
  • Потребителят решава да опита отново. doPermissionsStuff() е наречен.
  • Приложения за приложения checkSelfPermission() и (отново) определя, че разрешението все още не е прието
  • Приложения за приложения shouldShowRequestPermissionRationale(), Този път тя се връща вярно.
  • Приложението показва успокояващо и успокояващо съобщение допотребителят, че не, не искаме да поемем телефона си, просто искаме номер "IMEI", това е всичко и ако не позволите на приложението да получи достъп до IMEI, няма да получите безплатна проба. Трябва да начертая линията някъде,
  • Пресата на потребителите продължават, така че mHasReadRationale флагът е настроен на true и doPermissionsStuff() методът се извиква отново.
  • Приложения за приложения checkSelfPermission() и познай какво? разрешението все още не е разрешено
  • Тъй като флагът е зададен, потребителят не получава разумния потребителски интерфейс.
  • Приложения за приложения requestPermissions()
  • Системата ще поиска от потребителя "Разрешаване на приложението да прави и управлява телефонни обаждания?"
  • Потребителят се отказва от съдбата и натиска "Да".
  • onRequestPermissionsResult() се нарича с предоставения резултат и безплатната пробна регистрация се движи напред.

Също така трябва да проверите примерния код на Google на адрес https://developer.android.com/samples/RuntimePermissions/index.html


Свързани въпроси
Най - известен