安卓 11 |范围存储实施

Posted

技术标签:

【中文标题】安卓 11 |范围存储实施【英文标题】:Android 11 | Scoped storage enforcement 【发布时间】:2020-07-07 00:57:41 【问题描述】:

根据文档

使用范围存储,除非您的应用需要访问存储在应用特定目录之外以及 MediaStore API 可以访问的目录之外的文件。如果您将特定于应用程序的文件存储在外部存储上,则可以通过将这些文件放置在外部存储上的特定于应用程序的目录中来更轻松地采用范围存储。这样一来,您的应用在启用范围存储时保持对这些文件的访问。

在我的情况下,我正在使用以下方法创建一个文本文件:

File root = new File(this.getExternalFilesDir(null), "sample");
    if (!root.exists()) 
        root.mkdirs();
    
File file = new File(root, "sample.txt");

Above 正在以下位置创建文件(但没有可用的 SD 卡):

/storage/emulated/0/android/data/<package-name>/files/sample.txt

我正在对其进行写入操作。

以下是查询:

    在参考上述文档时,如果 Scoped 存储强制适用于上述场景,是否仍不明确?我是否需要实现 Scoped Storage 或者它会在没有任何更改的情况下工作并且不会受到 Android 11 行为更改的影响。

    据我了解,由于 Android 11,Scoped 存储强制实施没有任何影响。因为我没有应用需要访问存储在应用特定目录之外的文件的用例。这种理解正确吗?

    如果我想读取位于 Downloads 文件夹下的文件,我需要实现 Scoped Storage,因为我的应用程序想要访问存储在应用程序特定目录之外的文件。这种理解正确吗?

【问题讨论】:

我认为您的假设是正确的。而且我不记得在访问外部应用程序文件时遇到安全问题。是的,如果您想从 Scoped 存储中获取文件。如果您实际使用扩展名被识别为“application/octet-stream”的各种文件,您将度过一段糟糕的时光,甚至更糟。 阅读此***.com/a/66366102/9917404 【参考方案1】:

您绝对可以使用 File API 创建和访问 /storage/emulated/0/Android/data/ 中的文件。据我所知,这些位置没有变化。我已经做到了。

要访问下载中的文件,是的,根据我所阅读的内容,需要范围存储。我没有对此进行测试,但文档很清楚这是 Android 11 中的法律。这是一个糟糕的法律,但仍然是法律。

【讨论】:

以上是关于安卓 11 |范围存储实施的主要内容,如果未能解决你的问题,请参考以下文章

如何将站点范围的设置存储在数据库中?

从android 11的范围存储中删除图像

范围实施中的例外

企业实施微服务架构的范围

如何将 expo-image-picker 与 android 11 范围存储一起使用?

自动化运维平台实施前是否需要进行标准化,范围如何?