requestLegacyExternalStorage 在 Android 11 中不起作用 - API 30
Google最近引入了一些与API 29中的存储API相关的更改,例如范围存储,我们通过在清单中添加“requestLegacyExternalStorage=true”来选择退出。但是现在当我瞄准SdkVersion 30时,这似乎不再有效。此更改后,下载目录中的某些文件未列出(File.listFiles)。
Google最近引入了一些与API 29中的存储API相关的更改,例如范围存储,我们通过在清单中添加“requestLegacyExternalStorage=true”来选择退出。但是现在当我瞄准SdkVersion 30时,这似乎不再有效。此更改后,下载目录中的某些文件未列出(File.listFiles)。
但是现在当我瞄准SdkVersion 30时,这似乎不再有效。
这是正确的。Android 11(API 30+)不执行任何操作,您不能再“选择退出”。它在 Android 10 中可用,为开发人员提供过渡/宽限期,以便能够迁移到作用域存储模型。requestLegacyExternalStorage=true
选项 1:在仍以 API 29 为目标的情况下迁移应用中的数据,然后迁移的数据与作用域存储兼容后,您应该能够发布面向 API 30 的更新 - https://developer.android.com/training/data-storage/use-cases
如果用户跳过此版本并直接从以前的版本更新到最新版本,并且您遇到无法访问的未迁移数据,则这可能会带来自己的问题。
选项2:Google似乎看到了这个明显的警告,并且在定位API 30时包含了一个选项,以允许您迁移数据。https://developer.android.com/reference/android/R.attr#preserveLegacyExternalStoragepreserveLegacyExternalStorage=true
展望未来,您可以参考此表,根据用例决定使用哪种存储“框架”:https://developer.android.com/training/data-storage
根据某些应用程序与API的交互方式,某些应用程序可能无法成功迁移,因为Google的解决方案不会涵盖所有当前的用例,并且可能没有迁移路径。File
例如,几年前我发布了一个应用程序,允许用户使用和更新专辑插图图像的数据来更新专辑插图 - 这存储在共享存储中。在查看了Android 10 + AOSP源代码之后,似乎曾经用于更新专辑插图以指向数据文件的应用程序不再有效,仅仅是因为内部在隐藏文件夹中创建自己的艺术品,直接查看mp3并使用,并且从不引用插入以引用艺术品的艺术品。因此,即使您可以自己更新图稿,查询并查看它,其他应用程序也必须在API 29 +中使用不引用更新的值,并且懒惰地创建图稿,或者在文件夹中选择已生成的文件。显然,这些都没有记录在案,我的应用程序遭到了负面评论的强烈反对,但这些变化是重大的改变,完全超出了我的控制范围,并带我浏览了AOSP源代码,发现Android从根本上改变了行为。MediaStore
ContentResolver
MediaProvider
MediaStore
MediaProvider
.thumbnails
MediaExtractor
ContentValues
MediaStore
ContentResolver#loadThumbnail
.thumbnails
(这不是一个咆哮,而是一个例子,说明由于AOSP的基本未记录行为,这些变化没有提供迁移路径)。
如 https://developer.android.com/about/versions/11/privacy/storage 所述,Android 11上的存储空间有一些变化:
requestLegacyExternalStorage
无论目标 sdk 如何,都将继续工作requestLegacyExternalStorage
requestLegacyExternalStorage
false
了 preserveLegacyExternalStorage
,则为(这是纯迁移情况,如果用户卸载/重新安装应用程序,则不会保留此状态)requestLegacyExternalStorage
true
此时,您几乎被迫实施作用域存储。除非您已准备好迁移,否则请继续定位 sdk 29,因为无法在具有目标 sdk 30 的 Android 11 设备上强制执行旧版存储。
更新:截至 2021 年 8 月,Play 商店需要目标 sdk 30