Перейти к содержанию
  • Регистрация
  • 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

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

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


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

Рекомендуемые сообщения

  • 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

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

Благодарю!

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


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

    • От 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 пользователей онлайн

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

×
×
  • Создать...