requestLegacyExternalStorage 在 Android 11 - API 30 中不起作用

Ebi*_*Joy 30 java storage android android-11

Google 最近引入了一些与 API 29 中的存储 API 相关的更改,例如范围存储,我们通过在清单中添加“requestLegacyExternalStorage=true”来选择退出。但是现在当我定位SdkVersion 30 时,这似乎不再起作用。在此更改后,下载目录中的某些文件未列出 (File.listFiles)。

Mar*_*een 41

但是现在当我 targetSdkVersion 30 时,这似乎不再起作用

那是正确的。Android 11 (API 30+) requestLegacyExternalStorage=true什么也不做,你不能再“选择退出”。它在 Android 10 中可用,为开发人员提供一个过渡/宽限期,以便能够迁移到作用域存储模型。

选项 1:在您的应用程序中迁移数据,同时仍以 API 29 为目标,一旦您迁移的数据与范围存储兼容,您应该能够发布以 API 30 为目标的更新 - https://developer.android.com/training/数据存储/用例

如果用户跳过此版本并直接从以前的版本更新到最新版本,并且您遇到无法访问的未迁移数据,这可能会带来其自身的问题。

选项 2:Google 似乎看到了这个明显的警告,并在以preserveLegacyExternalStorage=trueAPI 30 为目标时包含了一个选项,以允许您迁移数据。https://developer.android.com/reference/android/R.attr#preserveLegacyExternalStorage

展望未来,您可以参考此表来根据用例决定使用哪种存储“框架”:https : //developer.android.com/training/data-storage

某些应用程序可能无法成功迁移,这取决于它们与FileAPI 的交互方式,因为 Google 的解决方案不会涵盖所有当前用例,并且可能没有迁移路径。

例如,几年前我发布了一个应用程序,允许用户使用更新专辑插图MediaStoreContentResolver更新专辑插图图像的数据 - 这存储在共享存储中。查看了 Android 10+ AOSPMediaProvider源代码后,似乎过去用于MediaStore更新专辑插图以指向数据文件的应用不再有效,仅仅是因为MediaProvider内部在隐藏.thumbnails文件夹中创建了自己的插图,直接查看 mp3 和使用MediaExtractor, 并且从不引用ContentValues插入来引用图稿的 。因此,即使您可以自己更新艺术品,查询MediaStore它并查看它,其他应用程序也必须使用ContentResolver#loadThumbnail在 API 29+ 中,它不引用您更新的值,或者懒惰地创建图稿,或者选择文件.thumbnails夹中已经生成的文件。显然,这些都没有被记录在案,我的应用程序遭到了大量负面评论的强烈反对,但这些变化是破坏性的变化,完全超出了我的控制,让我查看了 AOSP 源代码,发现 Android 已经从根本上改变了行为。

(这不是咆哮,而是一个示例,说明这些更改如何由于对 AOSP 的基本未记录行为而无法提供迁移路径)。

  • SKD 29以下的Android版本怎么样?权限如何处理?我的应用程序支持 SDK 21+。我仍然需要考虑这些版本的权限。谢谢! (2认同)

Paw*_*wel 29

https://developer.android.com/about/versions/11/privacy/storage所述,Android 11 上的存储有一些变化:

  • 安卓 10 设备
    • requestLegacyExternalStorage 无论目标sdk如何,都将继续工作
  • 安卓 11 设备
    • 针对 sdk 29 的新安装:requestLegacyExternalStorage尊重价值
    • 针对 sdk 30 的新安装:requestLegacyExternalStorage总是false
    • 从目标 sdk 29 升级到 30:如果preserveLegacyExternalStorage已设置,requestLegacyExternalStorage则为true(这是纯迁移案例,如果用户卸载/重新安装应用程序,则不会保留此状态)

在这一点上,您几乎被迫实施范围存储。除非您准备好迁移,否则请继续以 sdk 29 为目标,因为无法在具有目标 sdk 30 的 Android 11 设备上强制执行旧存储。

更新:截至 2021 年 8 月,Play 商店将需要目标 sdk 30,因此如果您计划在那里发布,那么届时必须准备好范围存储实施

  • 我搜索了6个小时,但终于找到了清晰的概念,谢谢,但是,有没有任何教程可以显示迁移并支持所有api? (2认同)