对所有 Android 版本的“文档”文件夹的读/写访问权限?

Posted

技术标签:

【中文标题】对所有 Android 版本的“文档”文件夹的读/写访问权限?【英文标题】:Read/Write access to 'Documents' folder for all Android versions? 【发布时间】:2021-08-04 08:17:47 【问题描述】:

我目前使用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS) 作为路径。我已请求android.permission.WRITE_EXTERNAL_STORAGE。我的目标是 SDK 30。我已经成功地在 Android 8 和 Android 11 上读取和写入文件,但不是 Android 10。将 android:ignore="ScopedStorage"android:requestLegacyExternalStorage="true" 添加到我的 AndroidManifest.xml 不起作用。

阅读官方文档,非常混乱。我尝试了另一种方法,使用ACTION_OPEN_DOCUMENT_TREE 缩进,但我只能浏览下载文件夹。我无法进入 Documents 文件夹。

这里有多个类似的问题,但对我来说并没有完全触及问题的核心。任何人都可以分享一些关于如何做一些基本的事情,比如对 Documents 文件夹进行简单的文件访问吗?

【问题讨论】:

在清单中请求旧版外部存储应该足以在 Android 10 下以经典方式访问 Documents 文件夹。 当然,当 ACTION_OPEN_DOCUMENTS_TREE 的 gui 打开时,用户可以浏览整个外部存储。了解用户如何浏览。确实有些事情很棘手。默认情况下,该 gui 不显示内部/外部存储.. 谢谢。我怀疑在面向 Android 30 时请求旧版存储可能会被忽略。 没有。它不适用于 Android 10 设备。 我觉得有点混乱。我注意到它应该是 Environment.getExternalStoragePublicDirectory 而不是 Environment.getExternalPublicStorageDirectory 【参考方案1】:

实际上,问题在于这个特定的 Android 10 设备上没有“文档”文件夹。手动创建一个修复它。所以真正的问题是Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS) 有时不会根据设备为您提供“文档”目录。

但是,我不相信这是在 Android 11 上执行此操作的正确方法(尽管它目前对我有用)。

【讨论】:

我猜这不应该在 Android 11 上运行,目标是 SDK 30。但由于某种原因它在模拟器上运行。我收到此 LINT 警告:WRITE_EXTERNAL_STORAGE no longer provides write access when targeting Android 11+, even when using 'requestLegacyExternalStorage' 当然遗憾的是您没有使用 File.exists().... 并使用了 mkdir() ... 不,它不提供在 Android 11 设备上的写访问权限,因为写访问权限是已经隐式授予。试试不用,看看你能不能写。 requestLegacyExternalStorage 仅适用于 Android 10 设备。 android.permission.WRITE_EXTERNAL_STORAGE 是 Android 8 所必需的。 是的。当然。确实。对于除 Android 11 之外的所有其他 Android 版本。我告诉过你,Android 11 设备不需要它。我让你测试并确认这一点。 已确认:android.permission.READ_EXTERNAL_STORAGE 适用于 Android 11。但由于 android.permission.WRITE_EXTERNAL_STORAGE 适用于我测试过的所有内容,那么在我的代码中测试 SDK 有什么好处吗?无论如何,清单仍然需要写入权限。

以上是关于对所有 Android 版本的“文档”文件夹的读/写访问权限?的主要内容,如果未能解决你的问题,请参考以下文章

git 是不是存储文件的读、写、执行权限?

POI完成Excel文件的读和写

有名管道的读和写

Android Q (10) 请求访问所有存储的权限。范围存储

linux目录权限

如何对 Excel 文件和 SQL 模式文件执行更好的文档版本控制