在 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.
2条答案
按热度按时间pdkcd3nj1#
在Android 11+设备上,listFiles()将根据具体的公共目录,仅列出应用本身创建的文件或一些媒体文件。
在尝试读取之前,不要只使用TFile.Exists(),也要使用TFile.CanRead()。
cbjzeqam2#
这将列出文件: