如何在 Android 10 上直接从外部下载目录读取文件(Q)

voi*_*bar 5 storage android

我尝试通过执行以下操作从 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();
        }
Run Code Online (Sandbox Code Playgroud)

我还在android:requestLegacyExternalStorage="true"清单中设置了请求WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE运行时权限。

该文件存在,但是当尝试打开文件描述符时,出现异常: java.io.FileNotFoundException: open failed: EACCES (Permission denied)

我阅读了Android Q 存储中所做的更改,但无法弄清楚如何在没有用户交互的情况下读取文件。

谢谢!

voi*_*bar 0

经过几个小时的尝试弄清楚到底发生了什么,我终于找到了解决方案。

我在清单中添加了:

android:requestLegacyExternalStorage="true"
Run Code Online (Sandbox Code Playgroud)

requestLegacyExternalStorage直接从 Android Studio 重建和重新安装时,构建系统或 Android 运行时不会在清单中注册更改,并且不会注册请求 。

我通过完全卸载应用程序来修复它:adb uninstall com.example.app并从 android studio 重新安装它。