簡體   English   中英

Delphi Rio 無法讀取具有 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM