Google最近在API 29中引入了一些与存储API相关的更改,如作用域存储,我们通过在Manifest中添加“requestLegacyExternalStorage=true”来选择退出。但现在当我将目标设为SdkVersion 30时,这似乎不再起作用。在此更改后,下载目录中的一些文件没有列出(File.listFiles)。
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的解决方案不会涵盖当前的所有用例,而且可能没有迁移路径。例如,几年前,我发布了一个应用程序,允许用户使用MediaStore和ContentResolver更新专辑封面图片的数据-这是存储在共享存储中。AOSP MediaProvider源代码似乎过去使用MediaStore更新专辑图稿以指向数据文件的应用不再工作,仅仅是因为MediaProvider在一个隐藏的.thumbnails文件夹中内部创建了自己的图稿,直接查看mp3并使用MediaExtractor,并且从不引用插入来引用图稿的ContentValues。因此,即使您可以自己更新图稿,查询MediaStore并查看它,其他应用必须在API 29+中使用ContentResolver#loadThumbnail,它不引用您更新的值,要么懒惰地创建艺术品,要么在.thumbnails文件夹中挑选已经生成的文件。显然,这些都没有记录,我的应用受到了大量负面评价的反弹,然而,这些变化是突破性的变化,完全超出了我的控制,并采取了我通过AOSP源代码查看,发现Android已经从根本上改变了行为。(This这不是一个咆哮,而是一个例子,说明这些变化如何提供没有迁移路径,因为基本的无文件记录的行为AOSP)。
requestLegacyExternalStorage=true
preserveLegacyExternalStorage=true
File
MediaStore
ContentResolver
MediaProvider
.thumbnails
MediaExtractor
ContentValues
ContentResolver#loadThumbnail
6yjfywim2#
如https://developer.android.com/about/versions/11/privacy/storage中所述,Android 11上的存储有一些变化:
requestLegacyExternalStorage
false
preserveLegacyExternalStorage
true
在这一点上,你几乎不得不实现作用域存储,除非你已经准备好迁移,否则就继续以sdk 29为目标,因为没有办法在目标为sdk 30的Android 11设备上强制执行遗留存储。
a6b3iqyw3#
不要这样做,直到2021年初(谷歌说):-如果您希望以android 11为目标,则应使用MANAGE_EXTERNAL_STORAGE权限。访问此页面了解更多详情:https://developer.android.com/training/data-storage/manage-all-files
ukxgm1gy4#
在Android 11上运行但以Android 10(API级别29)为目标的应用仍可以请求requestLegacyExternalStorage属性。此标志允许应用暂时退出与作用域存储关联的更改,例如授予对不同目录和不同类型媒体文件的访问权限。将应用更新为以Android 11为目标后,系统将忽略requestLegacyExternalStorage标志。
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.javahttps://raw.githubusercontent.com/apache/cordova-plugin-media/4093f7e14fe65f94ffbef072ed188a0205e78a59/src/android/AudioPlayer.java
5条答案
按热度按时间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的解决方案不会涵盖当前的所有用例,而且可能没有迁移路径。例如,几年前,我发布了一个应用程序,允许用户使用
MediaStore
和ContentResolver
更新专辑封面图片的数据-这是存储在共享存储中。AOSPMediaProvider
源代码似乎过去使用MediaStore
更新专辑图稿以指向数据文件的应用不再工作,仅仅是因为MediaProvider
在一个隐藏的.thumbnails
文件夹中内部创建了自己的图稿,直接查看mp3并使用MediaExtractor
,并且从不引用插入来引用图稿的ContentValues
。因此,即使您可以自己更新图稿,查询MediaStore
并查看它,其他应用必须在API 29+中使用ContentResolver#loadThumbnail
,它不引用您更新的值,要么懒惰地创建艺术品,要么在.thumbnails
文件夹中挑选已经生成的文件。显然,这些都没有记录,我的应用受到了大量负面评价的反弹,然而,这些变化是突破性的变化,完全超出了我的控制,并采取了我通过AOSP源代码查看,发现Android已经从根本上改变了行为。(This这不是一个咆哮,而是一个例子,说明这些变化如何提供没有迁移路径,因为基本的无文件记录的行为AOSP)。
6yjfywim2#
如https://developer.android.com/about/versions/11/privacy/storage中所述,Android 11上的存储有一些变化:
requestLegacyExternalStorage
将继续工作,而不考虑目标sdkrequestLegacyExternalStorage
值requestLegacyExternalStorage
始终为false
preserveLegacyExternalStorage
,则requestLegacyExternalStorage
为true
(这是纯迁移情况,如果用户卸载/重新安装应用程序,则不会保留此状态)在这一点上,你几乎不得不实现作用域存储,除非你已经准备好迁移,否则就继续以sdk 29为目标,因为没有办法在目标为sdk 30的Android 11设备上强制执行遗留存储。
a6b3iqyw3#
不要这样做,直到2021年初(谷歌说):-
如果您希望以android 11为目标,则应使用MANAGE_EXTERNAL_STORAGE权限。
访问此页面了解更多详情:https://developer.android.com/training/data-storage/manage-all-files
ukxgm1gy4#
在Android 11上运行但以Android 10(API级别29)为目标的应用仍可以请求requestLegacyExternalStorage属性。此标志允许应用暂时退出与作用域存储关联的更改,例如授予对不同目录和不同类型媒体文件的访问权限。将应用更新为以Android 11为目标后,系统将忽略requestLegacyExternalStorage标志。
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