谷歌最近在API 29中引入了一些与存储API相关的更改,例如作用域存储,我们通过在清单文件中添加'requestLegacyExternalStorage=true'来选择退出。但是现在当我将targetSdkVersion升级到30时,这似乎不再起作用了。此更改后下载目录中的某些文件未列出(File.listFiles)。
谷歌最近在API 29中引入了一些与存储API相关的更改,例如作用域存储,我们通过在清单文件中添加'requestLegacyExternalStorage=true'来选择退出。但是现在当我将targetSdkVersion升级到30时,这似乎不再起作用了。此更改后下载目录中的某些文件未列出(File.listFiles)。
MediaStore
和ContentResolver
更新专辑封面图像的数据 - 这些数据存储在共享存储中。查看Android 10+ AOSP MediaProvider
源代码后,似乎以前使用MediaStore
将专辑封面图像更新到指向数据文件的应用程序不再起作用,仅仅是因为MediaProvider
内部在隐藏的.thumbnails
文件夹中创建自己的艺术品,直接查看mp3并使用MediaExtractor
,从未引用插入的ContentValues
来引用艺术品。因此,即使您可以自己更新艺术品,查询MediaStore
并查看它,其他应用程序也必须在API 29+中使用ContentResolver#loadThumbnail
,该方法不引用您更新的值,并且会懒惰地创建艺术品,或者选择.thumbnails
文件夹中已经生成的文件。显然,这些都没有文档记录,我的应用程序受到了巨大的反弹和负面评价,但是这些变化是破坏性的变化,完全超出了我的控制范围,而且我需要查看AOSP源代码才能发现Android已经从根本上改变了行为。{{这不是抱怨,而是说明由于基本未记录的AOSP行为,这些更改没有提供迁移路径的例子。}}requestLegacyExternalStorage
将继续工作,无论目标 sdk 如何requestLegacyExternalStorage
值requestLegacyExternalStorage
总是 false
preserveLegacyExternalStorage
,则 requestLegacyExternalStorage
为 true
(这是纯迁移情况,如果用户卸载/重新安装应用程序,则不会保留此状态)requestLegacyExternalStorage = true
,则可以在所有 API 版本上运行。这样做是否正确? - Dr.jacky谷歌说,直到2021年初,请不要这样做:
如果您想针对Android 11进行目标设置,则应使用MANAGE_EXTERNAL_STORAGE权限。
有关更多详细信息,请访问此页面:https://developer.android.com/training/data-storage/manage-all-files
无需调用“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”,那么它应该可以工作。