Перейти к содержанию
Fire Monkey от А до Я
  • 0

Разрешение на запись и чтение на Delphi 12.1


Letter

Вопрос

Опубликовано

Здравствуйте, на Delphi 12.1 нужно что бы пользователь дал разрешение на запись и чтение файла. Данный код работал без проблем на Delphi 10.4. А на Delphi 12.1 при открытии приложения не появляется окно что бы дать разрешение, а сразу перескакивает на процедуру PermissionRequestResult и при проверки соответственно так как разрешение не дано выводит окно "Требуемые разрешения не получены". Подскажите что не так в коде?

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,System.Permissions,
  Androidapi.Jni.Os,Fmx.DialogService,
  Androidapi.Helpers;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure PermissionRequestResult(Sender: TObject;const APermissions: TClassicStringDynArray;const AGrantResults: TClassicPermissionStatusDynArray);
    procedure ExplainReason(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
     FPermissionWrite: string;
  FPermissionRead: string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.ExplainReason(Sender: TObject;
  const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
begin
   TDialogService.ShowMessage('Приложению нужен доступ к карте памяти для таких то целей',
    procedure(const AResult: TModalResult)
    begin
      APostRationaleProc;
    end)
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FPermissionWrite := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);
  FPermissionRead := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], PermissionRequestResult, ExplainReason);
end;

procedure TForm1.PermissionRequestResult(Sender: TObject;
  const APermissions: TClassicStringDynArray;
  const AGrantResults: TClassicPermissionStatusDynArray);
begin
 if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) then
  begin


TDialogService.ShowMessage('Разрешения получены');
  end
  else  begin
    TDialogService.ShowMessage('Требуемые разрешения не получены');

end;
end;

end.

 

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

  • 0
Опубликовано

Окно на запрос дать разрешение не открывается, почему?

  PermissionsService.RequestPermissions(
    [
      JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE),
      JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)],nil);

 

  • 0
Опубликовано (изменено)

Дело не в среде скорее всего, а в версии андроид, вам 

   if TJBuild_VERSION.JavaClass.SDK_INT >= 30  then
      begin
        if TJEnvironment.JavaClass.isExternalStorageManager = false then
        begin

          Intent := TJIntent.Create;
          Intent:=  TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
          intent.setData(TJnet_Uri.JavaClass.parse(StringToJString('package:').concat(TAndroidHelper.Context.getPackageName)));
          if intent.resolveActivity(TAndroidHelper.Context.getPackageManager) <> nil then
             TAndroidHelper.Context.startActivity(Intent);

        end;
      end;

   if TJBuild_VERSION.JavaClass.SDK_INT <= 29  then
   begin
       FPermissionReadExternalStorage := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE);
       FPermissionWriteExternalStorage := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);
       AppPermissions := AppPermissions + [FPermissionReadExternalStorage] +
                                          [FPermissionWriteExternalStorage];
   end;

Изменено пользователем OnePeople
  • 0
Опубликовано (изменено)
В 26.09.2024 в 05:24, OnePeople сказал:

Дело не в среде скорее всего, а в версии андроид, вам 

   if TJBuild_VERSION.JavaClass.SDK_INT >= 30  then
      begin
        if TJEnvironment.JavaClass.isExternalStorageManager = false then
        begin

          Intent := TJIntent.Create;
          Intent:=  TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
          intent.setData(TJnet_Uri.JavaClass.parse(StringToJString('package:').concat(TAndroidHelper.Context.getPackageName)));
          if intent.resolveActivity(TAndroidHelper.Context.getPackageManager) <> nil then
             TAndroidHelper.Context.startActivity(Intent);

        end;
      end;

   if TJBuild_VERSION.JavaClass.SDK_INT <= 29  then
   begin
       FPermissionReadExternalStorage := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE);
       FPermissionWriteExternalStorage := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);
       AppPermissions := AppPermissions + [FPermissionReadExternalStorage] +
                                          [FPermissionWriteExternalStorage];
   end;

а что есть AppPermissions? Такой же ответ был дан ранее Вами 1 апреля 2023 в теме "android 13, чтение extrernal storage", только вместо 
AppPermissions := AppPermissions + [FPermissionReadExternalStorage] +  [FPermissionWriteExternalStorage];                                  
было так :
PermissionsService.RequestPermissions([FPermissionReadExternalStorage] + [FPermissionWriteExternalStorage], nil);

но ведь суть вопроса - PermissionsService.RequestPermissions не работает для этих разрешений, окно на запрос дать разрешение не открывается.

всё же баг в платформе Rad Studio 12? или.....непонятно

и если я правильно понял, свойства TJEnvironment.JavaClass.isExternalStorageManager и ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION объявлены только в 12-ой студии, а она вышла 6 декабря 2023г.

Изменено пользователем Pavlo Павел Квадратов
  • 0
Опубликовано
18 часов назад, Pavlo Павел Квадратов сказал:

но ведь суть вопроса - PermissionsService.RequestPermissions не работает для этих разрешений, окно на запрос дать разрешение не открывается.

PermissionsService.RequestPermissions(AppPermissions);

Да оно и не будет открываться на андроид 13

Вам ничего не мешает добавить описание этих переменных.

  • 0
Опубликовано
В 08.03.2025 в 09:02, OnePeople сказал:

Да оно и не будет открываться на андроид 13

Вообще говоря да - то, как работает Rad Studio разных версий на разных версиях андроида оставляет много вопросов. Я бы сказал что всё кривое до безобразия.
Однако Всем доброго времени суток!

PermissionsService.RequestPermissions для разрешений на доступ к хранилищу работает и для 13-го андроида и для 14-го, если собирать проект в студии до 12 версии, вот как это выглядит в Rad Studio 11.1 (Delphi) на андроид 14 (на андроид 13 и 12 почти так же) :

photo_2025-03-10_08-13-35.thumb.jpg.d1a3bae9108ee684e8c1381eb667d52a.jpg

В 12-ой версии студии (Rad Studio 12.x) оно не работает, и соответственно сам андроид при просмотре разрешений на приложении ничего не видит
(объявленных разрешений нет), причём если запрашивались другие разрешения, например на блютуз - это работает, и разрешения предоставляются.
 

  • 0
Опубликовано
22 часа назад, Pavlo Павел Квадратов сказал:

Согласен, как вариант можно и так. Но тогда и Delphi не нужен ).

Да нет же. Для мобильных приложений есть библиотека alcinoe. Скоро там будет быстрый listbox и вообще будет ок. В исходниках вы можете посмотреть примеры реализаций множества api android, в том числе и запрос разрешений. Все будет работать очень быстро, красиво, и как рекомендует гугл. Также посмотрите на kastree там тоже много чего есть, вообще сейчас с андроид трудностей вообще у Делфи не каких, а то что встроенные компоненты Делфи глючат, то зачем их вообще использовать, если вам не нужна мультиплатформа. Любое апи переносится на Делфи за пару минут. Тут больше вопросов к самому андроида и их меняющемуся апи от версии к версии андроид, androidx библиотеки должны решать эти проблемы, но не всегда у них это получается.

  • 0
Опубликовано (изменено)
В 12.03.2025 в 10:18, OnePeople сказал:

Да нет же. Для мобильных приложений есть библиотека alcinoe. Скоро там будет быстрый listbox и вообще будет ок. В исходниках вы можете посмотреть примеры реализаций множества api android, в том числе и запрос разрешений. Все будет работать очень быстро, красиво, и как рекомендует гугл. Также посмотрите на kastree там тоже много чего есть, вообще сейчас с андроид трудностей вообще у Делфи не каких, а то что встроенные компоненты Делфи глючат, то зачем их вообще использовать, если вам не нужна мультиплатформа. Любое апи переносится на Делфи за пару минут. Тут больше вопросов к самому андроида и их меняющемуся апи от версии к версии андроид, androidx библиотеки должны решать эти проблемы, но не всегда у них это получается.

Спасибо за информацию, поизучаем тему, но удивительно то что на этом форуме не так уж и много обсуждений на эту тему

Изменено пользователем Pavlo Павел Квадратов

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить на вопрос...

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

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