[英]READ_EXTERNAL_STORAGE shows permission but not READ_EXTERNAL_STORAGE
[英]Delphi Rio fails to read external storage with READ_EXTERNAL_STORAGE permissions set
我有一個我曾經在德爾福西雅圖創建的項目,現在我想搬到德爾福里約。 我使用 findfirst/findnext 讀取外部 SD 卡上的目錄結構
i := findfirst(datadir + '*', faanyfile, ts);
datadir 變量包含一個有效的目錄。 在西雅圖,代碼工作正常(返回值 i=0)並且第一個目錄條目在變量 ts 中返回。 現在,在 Rio 上編譯相同的代碼,我得到一個返回錯誤值 i=13(訪問被拒絕)。
權限 READ_EXTERNAL_STORAGE 在我的項目中設置。
如果我將清單文件(在 Rio 中自動設置為 26)中的 targetSdkVersion 硬編碼為 19(即 minSdkVersion),即使在 Rio 中,代碼也會再次工作。 很明顯,某些處理 SD 卡訪問的方法已從 sdk 級別 19 更改為 26?
有人有任何提示嗎?
Android OS 從 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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.