Современные операционные системы разграничивают доступ к своим подсистемам для повышения уровня безопасности данных пользователя. Поэтому, если вы планируете работать с сервисами операционной системы, такими как: получение доступа к камере, файлам и т.д., то перед непосредственным обращением к сервису вам необходимо выполнить запрос разрешения на работу c сервисом.
Работа с разрешениями осуществляется через класс FGX.Permissions.TfgPermissionService
.
Запрос разрешения
Для запроса разрешения на работу с подсистемой ОС нужно воспользоваться асинхронным методом RequestPermissionsAsync
, указав список идентификаторов интересуемых разрешений. Метод выполняет асинхронный запрос разрешения, приводящий к появлению диалога о запросе разрешения у пользователя, и возвращает результат в анонимную процедуру.
const
{$IFDEF ANDROID}
CameraPermission = 'android.permission.CAMERA';
{$ELSE}
CameraPermission = '';
{$ENDIF}
begin
TfgPermissionService.RequestPermissionAsync(CameraPermission, procedure(const APermissionInfo: TfgPermissionInfo)
var
Message: string;
begin
case APermissionInfo.CheckResult of
TPermissionCheckResult.Denied:
Message := 'Доступ к камере запрещен пользователем';
TPermissionCheckResult.Granted:
Message := 'Доступ к камере выдан';
end;
TfgToast.Show(Message);
end);
end;
Если пользователь выдал разрешение ранее или отклонил его, то при повторном запросе разрешения диалоговое окно не показывается. Если пользователь отклонил разрешение ранее, то необходимо объяснить пользователю, зачем вам нужно то или иное разрешение и рассказать ему, как его можно выдать в настройках операционной системы.
Проверка разрешения
Если вы впервые запрашиваете разрешение у пользователя, то правилом хорошего тона является предварительное объяснение пользователю, зачем оно нужно. Это повышает шанс положительного ответа от пользователя. Поэтому перед непосредственным запросом разрешения полезно проверить, какое состояние у этого разрешения. Это можно сделать через методы CheckPermission
или CheckPermissions
:
var
PermissionInfo: TfgPermissionInfo;
Message: string;
begin
PermissionInfo := TfgPermissionService.CheckPermission(CameraPermission);
case PermissionInfo.CheckResult of
TPermissionCheckResult.WasNotRequested:
Message := 'Доступ к камере еще не был запрошен'; // Хорошее время объяснить, зачем разрешение нужно.
TPermissionCheckResult.Denied:
Message := 'Доступ к камере запрещен пользователем'; // Хорошее время объяснить, зачем разрешение нужно
// и как его вернуть в настройках ОС.
TPermissionCheckResult.Granted:
Message := 'Доступ к камере выдан';
end;
TfgToast.Show(Message);
end;