Android 操作系统从 API 23 开始引入了运行时权限模型。
这意味着除了在 Manifest 中指定权限外,您还需要在运行时要求用户授予您所谓的危险权限的权限。用户可以在被询问时选择授予您权限,但也可以随时撤销该权限。
每当您的应用程序处理需要运行时权限的代码时,它必须验证用户是否授予您该权限,并准备好处理用户未授予您权限的情况。
READ_EXTERNAL_STORAGE
是其中之一。
不同权限的概述(包括它们的分类)可以在权限概述中找到
要将您的应用程序上传到 Google Play 商店,您的应用程序需要支持最低 API 26(目前),并且 Delphi Rio 默认针对新的 API 级别。它还引入了对在运行时询问权限的支持。
以下是请求READ_EXTERNAL_STORAGE
许可并从共享下载文件夹中读取文件的基本示例。
uses
System.Permissions,
Androidapi.Helpers,
Androidapi.JNI.App,
Androidapi.JNI.OS,
...
procedure TMainForm.AddFiles;
var
LFiles: TArray<string>;
LFile: string;
begin
LFiles := TDirectory.GetFiles(TPath.GetSharedDownloadsPath);
for LFile in LFiles do
begin
Memo1.Lines.Add(LFile);
end;
end;
procedure TMainForm.Button1Click(Sender: TObject);
begin
PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE)],
procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>)
begin
if (Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then
begin
Memo1.Lines.Add('GRANTED');
AddFiles;
end
else
begin
Memo1.Lines.Add('NOT GRANTED');
end;
end)
end;