![](/img/trans.png)
[英]How to directly download a file to Download directory on Android Q (Android 10)
[英]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_STORAGE
和READ_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) 、 MediaStore或Intent#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.