簡體   English   中英

如何在 Android 10 (Q) 上直接從外部下載目錄讀取文件

[英]How to read a file directly from external download directory on Android 10 (Q)

我正在嘗試通過執行以下操作從 Android Q 上的下載文件夾中讀取文件:

        File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        File f = new File(downloadDir, "some-existing-file");
        if(!f.exists()) {
            throw new IllegalStateException();
        }

        Uri furi = Uri.fromFile(f);
        try {
            ParcelFileDescriptor des = getContentResolver().openFileDescriptor(
                    furi, "r", null);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

我還在清單中設置了android:requestLegacyExternalStorage="true" ,並請求了WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE運行時權限。

該文件存在,但在嘗試打開文件描述符時,出現異常: java.io.FileNotFoundException: open failed: EACCES (Permission denied)

我閱讀在 Android Q 存儲中所做更改,但無法弄清楚如何在沒有用戶交互的情況下讀取文件。

謝謝!

從 Android 6 (Marshmallow) 開始,用戶應該在運行時授予一些關鍵權限,以便他/她知道您的應用可以訪問哪些內容。
這個鏈接就是你所需要的

編輯
將這些添加到清單中

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


然后將此代碼添加到您的 oncreate 方法中

if (android.os.Build.VERSION.SDK_INT >= 23 && (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
                PackageManager.PERMISSION_GRANTED)) {
            ActivityCompat.requestPermissions(
                    this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    2000);
        }


這將彈出用戶同意權限的對話框。 如果用戶同意onRequestPermissionsResult方法將被調用,所以像這樣覆蓋onRequestPermissionsResult

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && requestCode == 2000) {
        //do what you want with files
    }
}


請注意,我將請求代碼設置為 2000。這是可選的。

此方法在API 級別 29 中已棄用。 為了提高用戶隱私,不推薦直接訪問共享/外部存儲設備。 當應用以Build.VERSION_CODES.Q為目標時,應用無法再直接訪問從此方法返回的路徑。 通過遷移到Context#getExternalFilesDir(String)MediaStoreIntent#ACTION_OPEN_DOCUMENT等替代方案,應用程序可以繼續訪問存儲在共享/外部存儲上的內容。

復制自安卓文檔。 文檔

經過太多小時的嘗試弄清楚到底發生了什么,我設法找到了解決方案。

我添加到清單:

android:requestLegacyExternalStorage="true"

直接從 Android Studio 重新構建和重新安裝時,構建系統或 android 運行時不會在清單中注冊更改,並且不會注冊requestLegacyExternalStorage的請求。

我通過完全卸載應用程序來修復它: adb uninstall com.example.app並從 android studio 再次安裝它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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