如何解决requestLegacyExternalStorage在Android 11中不起作用-API 30
Google最近引入了一些与API 29中的存储API相关的更改,例如范围存储,我们通过在清单中添加'requestLegacyExternalStorage = true'退出。但是现在当我以SdkVersion 30为目标时,这似乎不再起作用。更改后,下载目录中的某些文件未列出(File.listFiles)。
解决方法
但是现在我以SdkVersion 30为目标时,这似乎不再起作用
是正确的。 Android 11(API 30+)requestLegacyExternalStorage=true
不执行任何操作,您不再可以“选择退出”。 Android 10中提供了该功能,为开发人员提供了一个过渡/宽限期,使其能够迁移到作用域存储模型。
选项1:在仍以API 29为目标的情况下迁移应用程序中的数据,那么一旦迁移的数据与作用域存储兼容,您就应该能够发布以API 30为目标的更新-https://developer.android.com/preview/privacy/storage#scoped-storage。
如果用户跳过此版本并将其从先前版本直接更新为最新版本,并且您陷入无法访问的未迁移数据的困境,那么这可能会带来一些问题。
选项2:Google似乎看到了这一明显警告,并在将API 30定位为目标时包含了一个preserveLegacyExternalStorage=true
选项,以允许您迁移数据。 https://developer.android.com/reference/android/R.attr#preserveLegacyExternalStorage
展望未来,您可以参考此表来根据用例确定要使用的存储“框架”:https://developer.android.com/training/data-storage
基于某些应用与File
api交互的方式,有些应用可能根本无法成功迁移,因为Google的解决方案将无法涵盖所有当前用例,并且可能没有迁移路径
例如,我几年前发布了一个应用程序,该应用程序允许用户使用MediaStore
和ContentResolver
更新专辑插图的数据,该数据存储在共享资源中。查看了Android 10+ aosp MediaProvider
源代码后,似乎曾经使用MediaStore
更新专辑插图以指向数据文件的应用不再起作用,这仅仅是因为MediaProvider
内部在一个隐藏的.thumbnails
文件夹中创建自己的插图,该文件夹直接查看mp3并使用MediaExtractor
,而从不引用插入的引用插图的ContentValues
。因此,即使您可以自己更新作品,查询MediaStore
并查看它,其他应用也必须在api 29+中使用ContentResolver#loadThumbnail
,因为它不会引用您的更新值,并且会延迟创建艺术品,或在.thumbnails
文件夹中选择已生成的文件。显然,这些都没有得到记录,并且我的应用遭到了负面评价,引起了强烈反响,但是这些更改却打破了更改,完全超出了我的控制范围,使我查看了AOSP源代码,发现Android从根本上改变了行为。 / p>
(这不是胡言乱语,而是由于AOSP的根本无证行为,这些变化如何没有提供迁移路径的例子)。
,如https://developer.android.com/preview/privacy/storage中所述,Android 11的存储方面有一些更改:
- Android 10设备
-
requestLegacyExternalStorage
将继续工作,而不考虑目标sdk
-
- Android 11设备
- 针对新安装的sdk 29:尊重
requestLegacyExternalStorage
值 - 目标为sdk 30的新安装:
requestLegacyExternalStorage
始终为false
- 从sdk 29升级到30:如果设置了
preserveLegacyExternalStorage
,则requestLegacyExternalStorage
是true
(这是纯迁移情况,如果用户卸载/重新安装,则不会保留此状态该应用程序)
- 针对新安装的sdk 29:尊重
此时,您几乎被迫实施范围存储。除非您准备好迁移,否则请始终将目标定为sdk 29,因为无法在目标sdk 30的Android 11设备上强制执行旧存储。
,在 2021 年初之前不要这样做(谷歌说):-
如果您想定位到 android 11,您应该使用 MANAGE_EXTERNAL_STORAGE 权限。
访问此页面了解更多详情:https://developer.android.com/training/data-storage/manage-all-files
,在 Android 11 上运行但以 Android 10(API 级别 29)为目标的应用程序仍然可以请求 requestLegacyExternalStorage 属性。此标志允许应用程序暂时退出与范围存储相关的更改,例如授予对不同目录和不同类型媒体文件的访问权限。 将应用程序更新为面向 Android 11 后,系统会忽略 requestLegacyExternalStorage 标志。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。