Важно (9.07.22)

Если картинки в постах не отображаются, зайдите в блог через прокси. РКН заблокировал поддомены blogger.com на которые загружались картинки.

пятница, 7 апреля 2017 г.

Uses Permissions: Добавляем метод onRequestPermissionsResult в приложение

Как известно, начиная с АПИ 23 (Android 6) были усилены меры безопасности. Если приложению требуется разрешение (Uses Permission) из списка Опасных, то приложение должно запросить права у пользователя, посредством специального диалогового окна, результат выбора пользователя вернётся в методе onRequestPermissionsResult.
Так уж вышло, что в RAD Studio из коробки такого метода нет. Эту ситуацию я предлагаю исправить своей jar библиотекой.

Обновление от 13.11.19.
Внимание! Данная статья актуальна только для Delphi 10.1 (Berlin) и 10.2 (Tokyo). Если вы всё ещё используете версию Delphi ниже 10.3, то рекомендую перейти на новую версию!







Статьи на тему Uses Permissions:
  1. Uses Permissions: Теория
  2. Uses Permissions: Добавляем метод onRequestPermissionsResult в приложение (для Delphi 10.1/10.2)
  3. Uses Permissions: Практика(для 10.3)

Теория.

Начиная с Андроид 6 (АПИ 23) пользователи выдают разрешения во время работы приложения, а не при установке приложения. Пользователь может отменить разрешение в любое время через настройки приложения.

Разрешения делятся на две категории: Обычные и Опасные.
Обычные - не представляют опасности для конфиденциальных данных пользователя. Если приложение содержит такое разрешение, то оно будет автоматически выдано системой.
Список обычных разрешений.

Опасные - могут дать доступ к конфиденциальным данным пользователя. Если приложение содержит такое разрешение, то пользователь должен явно дать согласие на использование разрешения в вашем приложении.
Список опасных разрешений.


Для всех версий Андроид.
Необходимо указывать все требуемые разрешения в манифесте приложения. Эффект от этого объявления будет отличаться на разных версиях Андроида и указанного target SDK.
  • Если на устройстве установлен Андроид 5.1 или ниже и target SDK 22 или ниже, то пользователь даёт согласие на использование разрешений при установке приложения. Если пользователь не даёт согласия, то приложение не будет установлено.
  • Если на устройстве установлен Андроид 6.0 или выше и target SDK 23 или выше, то приложение должно запрашивать каждое опасное разрешение во время работы.  Пользователь может предоставлять или отклонять каждое разрешение, и приложение может продолжать работать с ограниченными возможностями, даже если пользователь отклоняет запрос разрешения.
Примечание. Необходимо протестировать своё приложение и предусмотреть нормальную работу в случае, когда пользователь отклонил разрешения.


Практика.

Методы.
Проверить разрешение: checkSelfPermission
Запросить разрешение у пользователя: requestPermissions
Получить результат запроса: onRequestPermissionsResult

В RAD Studio уже есть обёртки для почти всех методов, описанных выше, не хватает только реализации для последнего метода, позволяющего получить результат из окна запроса разрешения.

Итак, есть несколько способов добавить метод «onRequestPermissionsResult» в FMXNativeActivity, это:
  1. Отредактировать исходники FMXNativeActivity и пересобрать библиотеку fmx.jar, добавить её в проект
  2. Создать своё Activity и Listener, собрать в jar библиотеку и добавить в проект
Я попробовал оба варианта и пришёл к выводу, что пересобирать fmx.jar и таскать с каждым проектом всю либу целиком не очень удобно. Да и по опыту уже знаю, что у многих не получается пересобирать jar библиотеки. Поэтому выбор пал на второй способ. Также исчезают проблемы с публичным распространением.

Для того чтобы использовать новые методы необходимо предварительно проверить версию АПИ на устройстве. А дальше всё просто:
  1. Проверяем версию АПИ
  2. Проверяем необходимое разрешение
  3. Если разрешение не выдано, то запрашиваем его у пользователя
  4. Продолжаем работу приложения
Примечание. У гугла есть библиотека «Android Support Library», пока, я ей не занимался, но плюс от неё в том, что вам не придётся проверять версию АПИ на устройстве.

Библиотеку и обёртку, я выложил на GitHub, там же вы найдёте пример использования.

Для добавления библиотеки в проект необходимо:
  1. Добавить библиотеку «Custom.jar» в проект через Project Manager
  2. Подключить модуль «CustomActivityEvent.pas» в секцию uses
  3. Реализовать метод «procedure onReceivePermissionsResult(const ASender: TObject; const AMessage: TMessage);» в классе формы
  4. Подписаться на сообщения "TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultPermissions, onReceivePermissionsResult);"
  5. Открыть «AndroidManifest.template.xml», найти «com.embarcadero.firemonkey.FMXNativeActivity» и заменить на «com.embarcadero.firemonkey.CustomActivity»

Ссылка на репозиторий: https://github.com/AndrewEfimov/CustomActivityAndListener


На этом всё. Спасибо за внимание.