Важно (9.07.22)

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

среда, 13 ноября 2019 г.

Uses Permissions: Практика

Из статьи «Uses Permissions: Теория» вы уже узнали о том, как устанавливать необходимые разрешения, а также о том какие бывают разрешения (Обычные и Опасные). Теперь давайте разберёмся, как запрашивать разрешения во время работы приложения.
Тут сразу нужно учесть один момент.
«Запросы разрешений» добавили в Delphi 10.3 (из коробки). Ранее (в 10.1 и 10.2) такой возможности из коробки не было. Поэтому я в своё время написал JAR-библиотеку, позволяющую делать запросы и получать результаты, почитать можно тут: Uses Permissions: Добавляем метод onRequestPermissionsResult в приложение.

Внимание! В данной статье я буду рассматривать способ «из коробки», т.е. статья по Delphi 10.3.* и выше. Если вы всё ещё используете версию Delphi ниже 10.3, то рекомендую перейти на новую версию!

Обновление от 13.11.19.
 

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

Общая теория (Немного освежим память)

В Android 6 (api 23) усилили меры безопасности. Требования Google к указанию и запросу разрешений изменились. Тут ничего сложного нет и есть всего два пункта (один из которых мы рассмотрим подробнее).
  1. Если приложение запускается на устройствах под управлением Android 5.1 и ниже, то достаточно простого указания разрешений в AndroidManifest.xml. (Если вы читали «Uses Permissions: Теория», то уже понимаете, что этим занимается то самое окно со списком всех разрешений). Со стороны пользователя, подтверждение разрешений, требуемых вашему приложению происходит при установке приложения на устройство.
  2. Если приложение запускается на устройствах под управлением Android 6.0 и выше, то выполнения пункта 1 уже недостаточно. В этом случае, помимо выполнения пункта 1, вам необходимо запросить «Опасные» разрешения во время работы приложения. Со стороны пользователя, подтверждение разрешений, требуемых вашему приложению происходит во время работы приложения.

Реализация в Delphi 10.3.*

Именно в версии 10.3 был добавлен механизм запроса разрешения во время работы приложения. Реализован он (по моему скромному мнению) очень правильно.
Если быть точнее, то используется библиотека «android.support.v4». Это такая полезная библиотека, разрабатываемая и поддерживаемая Google, для обеспечения совместимости старых версий Android с новыми функциями, добавляемыми в Android API. Ознакомиться подробнее можно тут: Support Library Packages

Что она даёт нам в данном случае.

Например:
В Android 4.4.2 нет функционала, поддерживающего запрос прав во время выполнения приложения. Но наше приложение будут использовать не только на версии 4.4.2, но и на версиях выше 6. Как же быть?

Первое, что приходит в голову – это проверять версию API устройства перед попыткой запросить разрешение у пользователя. Мысль неплохая. Но зачем нам лишний код, особенно когда разрешений требуется много и в разных частях приложения.

Примечание. Google рекомендует запрашивать разрешения, только в момент обращения пользователя к функционалу приложения, которое требует разрешения.

И вот тут нам приходит на помощь эта библиотека. Если мы будем посылать запросы через неё, то нам не нужно заботиться об определении API устройства. Она сама всё определит, проверит, запросит и вернёт результат. Ну и плюс, поддержкой библиотеки занимается сам Google. Разработчики Embarcadero/IDERA обеспечили удобный доступ к функциям.


Думаю, теперь можно перейти к практике.



Практика

Появился новый модуль «System.Permissions», он отвечает за работу с запросами разрешений.
PermissionsService – функция через которую будем запрашивать и проверять разрешения. Даст доступ к методам класса TPermissionsService (это абстрактный класс, реализация его методов лежит в отдельном модуле для каждой платформы, пока есть только Android).

Методы TPermissonsService:

IsEveryPermissionGranted(const APermissions: TArray<string>): Boolean; - проверяет список разрешений.

IsPermissionGranted(const APermission: string): Boolean; – проверяет, предоставлено ли конкретное разрешение.


RequestPermissions – делает запрос разрешений.
Параметры:
  • APermissions – список требуемых разрешений.
  • AOnRequestPermissionsResult – Callback для получения результата запроса разрешения.
  • AOnDisplayRationale – Callback для обоснования необходимости получения разрешения.

Примеры использования можно посмотреть в папке «C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal». Их там больше 10…

Примеры:




На этом всё.