Google 最近在 API 29 中引入了一些与存储 API 相关的更改,例如范围存储,我们通过在清单中添加“requestLegacyExternalStorage=true”来选择退出。但是现在当我 targetSdkVersion 30 时,这似乎不再起作用了。此更改后,下载目录中的某些文件未列出 (File.listFiles)。
原文由 Ebin Joy 发布,翻译遵循 CC BY-SA 4.0 许可协议
Google 最近在 API 29 中引入了一些与存储 API 相关的更改,例如范围存储,我们通过在清单中添加“requestLegacyExternalStorage=true”来选择退出。但是现在当我 targetSdkVersion 30 时,这似乎不再起作用了。此更改后,下载目录中的某些文件未列出 (File.listFiles)。
原文由 Ebin Joy 发布,翻译遵循 CC BY-SA 4.0 许可协议
如 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
原文由 Pawel 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.2k 阅读
8 回答6k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
那是对的。 Android 11 (API 30+)
requestLegacyExternalStorage=true
什么都不做,你不能再“选择退出”。它在 Android 10 中可用,为开发人员提供过渡/宽限期,以便能够迁移到范围存储模型。选项 1:在您的应用程序中迁移数据,同时仍然以 API 29 为目标,然后一旦您迁移的数据与范围存储兼容,您应该能够发布一个以 API 30 为目标的更新 - https://developer.android.com/training/数据存储/用例
如果用户跳过此版本并直接从以前的版本更新到最新版本,并且您无法访问无法访问的未迁移数据,这可能会带来自己的问题。
选项 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+ AOSPMediaProvider
源代码之后,似乎曾经使用MediaStore
更新专辑插图以指向数据文件的应用程序不再有效,仅仅是因为MediaProvider
internally creates its own artwork in a hidden.thumbnails
folder looking directly at the mp3’s and using aMediaExtractor
, and never references theContentValues
that被插入以参考艺术品。因此,即使您可以自己更新艺术品,查询MediaStore
并查看它,其他应用程序也必须使用 API 29+ 中的ContentResolver#loadThumbnail
不引用您的更新值,或者懒惰地创建一个艺术品,或者在.thumbnails
文件夹中选择已经生成的文件。显然,这一切都没有记录在案,我的应用程序遭到负面评论的强烈反对,但这些更改是破坏性的更改,完全超出了我的控制范围,因此我查看了 AOSP 源代码,发现 Android 已经从根本上改变了行为。(这不是咆哮,而是一个例子,说明这些更改如何由于 AOSP 的基本未记录行为而没有提供迁移路径)。