繁体   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