【发布时间】:2022-11-14 02:57:11
【问题描述】:
在 Delphi 10.4 中,我能够获取 Android 设备共享存储中的文件列表。在 Delphi 11 中,具有必要的权限集(以编程方式或在设备上),TDirectory.GetFiles() 返回一个空列表(即零条目)。
TDirectory.GetDirectories() 工作正常,使用 TFile.Exists() 和我知道存在的文件名返回 true。但是,如果我尝试使用例如TFile.ReadAllText() 打开该文件,访问将被拒绝。有什么建议么?
这是一个在 Delphi 11 中失败的示例程序:
uses
System.Types,System.Classes,system.sysUtils,system.IOUtils,system.Permissions,
{$IFDEF ANDROID}
Androidapi.Helpers,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.Os,
{$ENDIF}
FMX.Types,FMX.Forms,FMX.Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
fOK:boolean;
procedure PermissionsResult(Sender: TObject;
const APermissions: TClassicStringDynArray;
const AGrantResults: TClassicPermissionStatusDynArray);
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure Tform1.PermissionsResult(Sender: TObject;
const APermissions: TClassicStringDynArray;
const AGrantResults: TClassicPermissionStatusDynArray);
var
n:integer;
begin
if length(AGrantResults)>0 then
for n:=0 to length(AGrantResults)-1 do
if not (AGrantResults[n] = TPermissionStatus.Granted) then fOK:=false;
end;
procedure FileList(dir:string;list:TstringList);
var
LList: TStringDynArray;
I: Integer;
begin
list.Clear;
Llist:=Tdirectory.GetFiles(dir);
if length(LList)>0 then
for I := 0 to Length(LList) - 1 do
list.Add(LList[I]);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
DataDir:string;
list:TstringList;
p:Tarray<string>;
begin
fOK:=true;
p:=[JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE),
JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)];
PermissionsService.RequestPermissions(p,PermissionsResult,nil);
if fOK then
begin
list:=TstringList.Create;
DataDir := TPath.GetSharedDocumentsPath;
showmessage(DataDir);
fileList(DataDir,list);
showmessage(inttostr(list.Count)+' '+list.Text);
list.Free;
end else showmessage('permission refused');
end;
end.
【问题讨论】:
-
两个版本中指定了哪些 Android API 目标?
-
对于 Delphi 10.4,它是 31,对于 Delphi 11,它是 32。
标签: android delphi permissions delphi-11-alexandria