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

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


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










Теория.

Начиная с Андроид 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. Открыть «AndroidManifest.template.xml», найти «com.embarcadero.firemonkey.FMXNativeActivity» и заменить на «com.embarcadero.firemonkey.CustomActivity»

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


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

Комментариев нет:

Отправить комментарий