自API 23起,Android操作系统引入了运行时权限模型。
这意味着除了在清单文件中指定权限外,您还需要在运行时请求用户授予所谓的危险权限。用户有权选择在被询问时是否授权给您许可,但是用户也可以随时撤回该权限。
每当您的应用程序涉及需要运行时权限的代码时,它必须验证用户是否已经授予了该权限,并准备处理用户未授权给您该权限的情况。
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;