适配:Android11存储

Posted wzj_what_why_how

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适配:Android11存储相关的知识,希望对你有一定的参考价值。

问题指引:

只出现在android11的机型,其他机型没有问题——
在这里插入图片描述

排查:

Error “java.io.FileNotFoundException: EPERM (Operation not permitted)”

从权限管理和Android版本差异排查,最终问题依旧存在。

解决:

将问题定位到简单的命名上来,修改名称之后,程序运行正常。
综上:Android 11 在文件命名方面做了更严格的规范,不允许使用“:”之类特殊符号。



强制执行分区存储

在 Android 11 上运行但以 Android 10(API 级别 29)为目标平台的应用仍可请求 requestLegacyExternalStorage 属性。应用可以利用此标记暂时停用与分区存储相关的变更,例如授予对不同目录和不同类型的媒体文件的访问权限。当您将应用更新为以 Android 11 为目标平台后,系统会忽略 requestLegacyExternalStorage 标记。

保持与 Android 10 的兼容性
如果应用在 Android 10 设备上运行时选择退出分区存储,建议您继续在应用的清单文件中将 requestLegacyExternalStorage 设为 true。这样,应用就可以在运行 Android 10 的设备上继续按预期运行。

将数据迁移到使用分区存储时可见的目录
如果您的应用使用旧版存储模型且之前以 Android 10 或更低版本为目标平台,您可能会将数据存储到启用分区存储模型后您的应用无法访问的目录中。在以 Android 11 为目标平台之前,请将数据迁移到与分区存储兼容的目录。

引入了与存储权限相关的以下变更

以任何版本为目标平台
第一个对话框中显示了一个名为“在‘设置’中允许”的链接
图 1. 应用使用分区存储并请求 READ_EXTERNAL_STORAGE 权限时显示的对话框。
不管应用的目标 SDK 版本是什么,以下变更均会在 Android 11 中生效:

存储运行时权限已重命名为文件和媒体。
如果您的应用未停用分区存储并且请求 READ_EXTERNAL_STORAGE 权限,用户会看到不同于 Android 10 的对话框。该对话框表明您的应用正在请求访问照片和媒体,如图 1 所示。

用户可以在系统设置中查看哪些应用具有 READ_EXTERNAL_STORAGE 权限。在设置 > 隐私 > 权限管理器 > 文件和媒体页面上,具有该权限的每个应用都列在允许存储所有文件下。如果您的应用以 Android 11 为目标平台,请记住,对“所有文件”的这种访问权限是只读访问权限。如需使用此应用读取和写入共享的存储空间中的所有文件,需要具有所有文件访问权限。

以 Android 11 为目标平台
如果应用以 Android 11 为目标平台,那么 WRITE_EXTERNAL_STORAGE 权限和 WRITE_MEDIA_STORAGE 特许权限将不再提供任何其他访问权限。

请注意,在搭载 Android 10(API 级别 29)或更高版本的设备上,您的应用可以提供明确定义的媒体集合,例如 MediaStore.Downloads,而无需请求任何存储相关权限。详细了解如何在处理应用中的媒体文件时仅请求必要的权限。

Refer:

https://developer.android.google.cn/about/versions/11/privacy/storage#java

以上是关于适配:Android11存储的主要内容,如果未能解决你的问题,请参考以下文章

Android 11 适配存储权限

适配:Android11存储

上架Google Play应用如何适配Android 11?

Android 11 变更及适配攻略

Android 11 变更及适配攻略

Android 10 和Android 11 适配采坑 实践篇