Firemonkey android 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

EDIT:На жаль, я не зробив трохи більше домашньої роботи на 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
  • Тепер все, що залишилося зробити, - це написати якийсь хитрий код 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 операція, яку потрібно перевизначити Activityс onRequestPermissionsResult спосіб:

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, щоб вони не могли знову і знову отримувати безкоштовну пробну версію. 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


Схожі запитання
Найбільш популярний