• 0
yooSee

Runtime permissions in Delphi 10.3 Rio

Вопросы

Всем привет, вот и я решил внести свою лепту в жизнь форума и сегодня мы разберемся с разрешениями на Delphi Rio под Андроид. 

Для примера мы будем использовать разрешения на чтение и запись с памяти устройства, для начала в нашем проекте выставим в Delphi>Project>Application>Uses Permissions галочки на Read External Storage и Write External Storage.

в uses проекта добавьте следующее

uses
  System.Permissions,
  Androidapi.Jni.Os,
  Androidapi.Helpers,

далее  создадим переменные

var
  Form: TForm;
....
  FPermissionWrite: string;
  FPermissionRead: string;

в Form.Create добавим следующий код

procedure TForm.FormCreate(Sender: TObject);
begin
   FPermissionWrite := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE); //Значение на запись
  FPermissionRead := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE); //Значение на чтение
end;

и теперь сам не посредственно запрос на подтверждение наших прав

procedure TForm.Button1Click(Sender: TObject);
begin
  PermissionsService.RequestPermissions
    ([FPermissionWrite, FPermissionRead], nil);
end;
//это вызовет окно с запросом разрешения прав

ну и для проверки бросим на форму TMemo и пару TButton , в них реализуем сохранение и чтение из файла с памяти устройства

procedure TForm.Button1Click(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile(TPath.Combine(TPath.GetSharedDocumentsPath,
    'test.txt'));
end;

procedure TForm.Button2Click(Sender: TObject);
begin
  Memo1.Lines.SaveToFile(TPath.Combine(TPath.GetSharedDocumentsPath,
    'test.txt'));
end;

P.S. Напоминаю что для работы TPath нам понадобится подключить в Uses 

uses
System.system.ioutils;

Надеюсь материал будет полезен! 

 

 

 

Permissions.zip

Изменено пользователем Роман Фил

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 ответа на этот вопрос

  • 0

Для полноценной работы вам нужно добавить параметры в вызов (иначе вы не узнаете дал ли пользователь разрешение или нет)

PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], nil);

Вот так:

PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], PermissionRequestResult, ExplainReason);

PermissionRequestResult - это обработка ответа пользователя

procedure TForm.PermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
begin
  if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) then
  begin
    // Ура! Пользователь дал разрешение на оба наших запроса. Выставялем глобальные флаги (к примеру) которые сигнализируют что можно читать/писать карту памти
  end
  else
    TDialogService.ShowMessage('Не возможно продолжить работу, требуемые разрешения не получены')
end;

И ExplainReason - если пользователь сдуру не дал разрешение, то вам нужно объяснить ему что без этого приложение работать не будет.

procedure TForm.ExplainReason(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
begin
  TDialogService.ShowMessage('Приложению нужен доступ к карте памяти для таких то целей, иначе приложение не сможет работать. Зайдите в настроки Андроид и дайте разрешение на доступ',
    procedure(const AResult: TModalResult)
    begin
      APostRationaleProc;
    end)
end;

 

Изменено пользователем Евгений Корепов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В поставке 10.3 есть примеры работы с правами.

Один из них можно найти по такому пути:
C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\Multi-Device Samples\Media\PhotoEditorDemo

Что интересно, этот же код можно без изменений использовать под любой другой платформой.
На других платформах приложение будет считать что ему выдали все права, и соответственно запускать все коллбеки без каких-либо вопросов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 12.02.2019 в 00:26, Евгений Корепов сказал:

Для полноценной работы вам нужно добавить параметры в вызов (иначе вы не узнаете дал ли пользователь разрешение или нет)


PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], nil);

Вот так:


PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], PermissionRequestResult, ExplainReason);

PermissionRequestResult - это обработка ответа пользователя


procedure TForm.PermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
begin
  if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) then
  begin
    // Ура! Пользователь дал разрешение на оба наших запроса. Выставялем глобальные флаги (к примеру) которые сигнализируют что можно читать/писать карту памти
  end
  else
    TDialogService.ShowMessage('Не возможно продолжить работу, требуемые разрешения не получены')
end;

И ExplainReason - если пользователь сдуру не дал разрешение, то вам нужно объяснить ему что без этого приложение работать не будет.


procedure TForm.ExplainReason(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
begin
  TDialogService.ShowMessage('Приложению нужен доступ к карте памяти для таких то целей, иначе приложение не сможет работать. Зайдите в настроки Андроид и дайте разрешение на доступ',
    procedure(const AResult: TModalResult)
    begin
      APostRationaleProc;
    end)
end;

 

Спасибо за дополнение!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 12.02.2019 в 18:05, Barbanel сказал:

В поставке 10.3 есть примеры работы с правами.

Один из них можно найти по такому пути:
C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\Multi-Device Samples\Media\PhotoEditorDemo

Что интересно, этот же код можно без изменений использовать под любой другой платформой.
На других платформах приложение будет считать что ему выдали все права, и соответственно запускать все коллбеки без каких-либо вопросов.

Благодарю!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От TAZAQ
      Доброго времени суток, возникло пару вопросов по поводу нового релиза студии, а конкретно Delphi 10.3 community:
      1) В каком месте находится презентованный z-order для компонентов и как он работает?
      2) Почему на inline объявление переменных ругается редактор кода, но при этом компилятор спокойно пережевывает и не давится?

    • От Юрий Гусач
      Доброго дня!
      Проясните пожалуйста ситуацию: при запуске программы  под Андроидом на различных устройствах я получаю размеры формы, которые вроде всегда в разы меньше чем максимальное разрешение экрана конкретного устройства. Я пробовал планшеты и разные смартфоны. Написал тестовую прогу, которая выводит СlientScreen и  ClientWidth формы, на которой ничего больше нет. Например для крайне бюджетного смартфона Fly FS-549 получилось 497 х 320, а по паспорту 854x480. Разрешение и так хреновое, а Delphi его еще сильнее уменьшает. -       Почему это происходит и можно ли как то это обойти?
       
       
    • От SIARHEI RAHOUSKI
      Создал проект там куча компонентов. Но разворачивании формы на весь экран компоненты размер не меняют:
      Прочитал про свойства align Но как только я выставлю Group box например left другим right все сбивается в кучу и поправить это не могу. 
      Как настроить align ?

    • От SIARHEI RAHOUSKI
      Как сделать форму с компонентами под все разрешения?

    • От SIARHEI RAHOUSKI
      Как сделать мозаику (drag/drop) ? Получается есть 2 прямоугольника (которые надо перетаскивать)  и есть ещё 2 прямоугольника (которые должны принимать) и ещё есть кнопка проверки. При нажатии определяет правильно ли разместили прямоугольники.
    • От SIARHEI RAHOUSKI
      Как задать градиентную заливку TChart? именно самих столбцов. 

    • От SIARHEI RAHOUSKI
      Как задать свои цвета круговой диаграмме и тень под ней ? 
    • От SIARHEI RAHOUSKI
      Как создать диаграмму из бд? Есть таблица Access со статистикой как создать диаграмму по ней ???
    • От SIARHEI RAHOUSKI
      Здравствуйте, у меня возник вопрос Как базу данных подключить к TGrid? Я использую Delphi XE3 и База данных Accsess: ADOConnection + ADOQuery + DataSource. И вот как отобразить в TGrid Таблицу бд ?
    • От SIARHEI RAHOUSKI
      Как в самой форме созданной в Delphi XE3 открыть word документ?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу