requestLegacyExternalStorage在Android 11中无法正常工作- API 30

j13ufse2  于 2023-03-06  发布在  Android
关注(0)|答案(5)|浏览(1453)

Google最近在API 29中引入了一些与存储API相关的更改,如作用域存储,我们通过在Manifest中添加“requestLegacyExternalStorage=true”来选择退出。但现在当我将目标设为SdkVersion 30时,这似乎不再起作用。在此更改后,下载目录中的一些文件没有列出(File.listFiles)。

ntjbwcob

ntjbwcob1#

但是现在,当我以SdkVersion 30为目标时,这似乎不再起作用
正确。Android 11(API 30+)requestLegacyExternalStorage=true不执行任何操作,您也不能再"选择退出"。Android 10中提供了该功能,为开发者提供过渡/宽限期,以便能够迁移到作用域存储模型。
选项1:迁移应用中的数据,同时仍以API 29为目标,然后,一旦迁移的数据与作用域存储兼容,您就应该能够发布以API 30-https://developer.android.com/training/data-storage/use-cases为目标的更新
如果用户跳过此版本,直接从以前的版本更新到最新版本,并且您无法访问未迁移的数据,那么这可能会带来自己的问题。
选项2:Google似乎看到了这个明显的警告,并在针对API 30时包含了一个preserveLegacyExternalStorage=true选项,以允许您迁移数据。www.example.comhttps://developer.android.com/reference/android/R.attr#preserveLegacyExternalStorage
接下来,您可以参考此表,根据使用情形确定要使用的存储"框架":https://developer.android.com/training/data-storage
基于与File API的交互方式,一些应用程序有可能无法成功迁移,因为Google的解决方案不会涵盖当前的所有用例,而且可能没有迁移路径。
例如,几年前,我发布了一个应用程序,允许用户使用MediaStoreContentResolver更新专辑封面图片的数据-这是存储在共享存储中。AOSP MediaProvider源代码似乎过去使用MediaStore更新专辑图稿以指向数据文件的应用不再工作,仅仅是因为MediaProvider在一个隐藏的.thumbnails文件夹中内部创建了自己的图稿,直接查看mp3并使用MediaExtractor,并且从不引用插入来引用图稿的ContentValues。因此,即使您可以自己更新图稿,查询MediaStore并查看它,其他应用必须在API 29+中使用ContentResolver#loadThumbnail,它不引用您更新的值,要么懒惰地创建艺术品,要么在.thumbnails文件夹中挑选已经生成的文件。显然,这些都没有记录,我的应用受到了大量负面评价的反弹,然而,这些变化是突破性的变化,完全超出了我的控制,并采取了我通过AOSP源代码查看,发现Android已经从根本上改变了行为。
(This这不是一个咆哮,而是一个例子,说明这些变化如何提供没有迁移路径,因为基本的无文件记录的行为AOSP)。

6yjfywim

6yjfywim2#

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

  • Android 10设备
  • requestLegacyExternalStorage将继续工作,而不考虑目标sdk
  • Android 11设备
  • 目标为sdk 29的新安装:考虑requestLegacyExternalStorage
  • 目标为sdk 30的新安装:requestLegacyExternalStorage始终为false
  • 从目标sdk 29升级到30:如果设置了preserveLegacyExternalStorage,则requestLegacyExternalStoragetrue(这是纯迁移情况,如果用户卸载/重新安装应用程序,则不会保留此状态)

在这一点上,你几乎不得不实现作用域存储,除非你已经准备好迁移,否则就继续以sdk 29为目标,因为没有办法在目标为sdk 30的Android 11设备上强制执行遗留存储。

  • 更新:Play商店要求目标sdk 30自2021年8月起 *
a6b3iqyw

a6b3iqyw3#

不要这样做,直到2021年初(谷歌说):-
如果您希望以android 11为目标,则应使用MANAGE_EXTERNAL_STORAGE权限。
访问此页面了解更多详情:https://developer.android.com/training/data-storage/manage-all-files

ukxgm1gy

ukxgm1gy4#

在Android 11上运行但以Android 10(API级别29)为目标的应用仍可以请求requestLegacyExternalStorage属性。此标志允许应用暂时退出与作用域存储关联的更改,例如授予对不同目录和不同类型媒体文件的访问权限。将应用更新为以Android 11为目标后,系统将忽略requestLegacyExternalStorage标志。

2hh7jdfx

2hh7jdfx5#

无需调用“requestLegacyExternalStorage=true”,因为它不适用于Android 11+。
https://github.com/apache/cordova-plugin-media中有一个新的更新,涵盖了android 11+的保存文件路径问题。
如果您在项目中更新了“/platforms/android/app/src/main/java/org/apache/cordova/media/AudioHandler.java“和“/platforms/android/app/src/main/java/org/apache/cordova/media/AudioPlayer.java“,那么它应该可以正常工作。
https://raw.githubusercontent.com/apache/cordova-plugin-media/4093f7e14fe65f94ffbef072ed188a0205e78a59/src/android/AudioHandler.java
https://raw.githubusercontent.com/apache/cordova-plugin-media/4093f7e14fe65f94ffbef072ed188a0205e78a59/src/android/AudioPlayer.java

相关问题