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 的解决方案不会涵盖所有当前用例,并且可能没有迁移路径。
例如,几年前我发布了一个应用程序,允许用户使用更新专辑插图MediaStore并ContentResolver更新专辑插图图像的数据 - 这存储在共享存储中。查看了 Android 10+ AOSPMediaProvider源代码后,似乎过去用于MediaStore更新专辑插图以指向数据文件的应用不再有效,仅仅是因为MediaProvider内部在隐藏.thumbnails文件夹中创建了自己的插图,直接查看 mp3 和使用MediaExtractor, 并且从不引用ContentValues插入来引用图稿的 。因此,即使您可以自己更新艺术品,查询MediaStore它并查看它,其他应用程序也必须使用ContentResolver#loadThumbnail在 API 29+ 中,它不引用您更新的值,或者懒惰地创建图稿,或者选择文件.thumbnails夹中已经生成的文件。显然,这些都没有被记录在案,我的应用程序遭到了大量负面评论的强烈反对,但这些变化是破坏性的变化,完全超出了我的控制,让我查看了 AOSP 源代码,发现 Android 已经从根本上改变了行为。
(这不是咆哮,而是一个示例,说明这些更改如何由于对 AOSP 的基本未记录行为而无法提供迁移路径)。
Paw*_*wel 29
如https://developer.android.com/about/versions/11/privacy/storage所述,Android 11 上的存储有一些变化:
requestLegacyExternalStorage 无论目标sdk如何,都将继续工作requestLegacyExternalStorage尊重价值requestLegacyExternalStorage总是falsepreserveLegacyExternalStorage已设置,requestLegacyExternalStorage则为true(这是纯迁移案例,如果用户卸载/重新安装应用程序,则不会保留此状态)在这一点上,您几乎被迫实施范围存储。除非您准备好迁移,否则请继续以 sdk 29 为目标,因为无法在具有目标 sdk 30 的 Android 11 设备上强制执行旧存储。
更新:截至 2021 年 8 月,Play 商店将需要目标 sdk 30,因此如果您计划在那里发布,那么届时必须准备好范围存储实施