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

问题描述

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

解决方法

但是现在我以SdkVersion 30为目标时,这似乎不再起作用

是正确的。 Android 11(API 30+)requestLegacyExternalStorage=true不执行任何操作,您不再可以“选择退出”。 Android 10中提供了该功能,为开发人员提供了一个过渡/宽限期,使其能够迁移到作用域存储模型。

选项1:在仍以API 29为目标的情况下迁移应用程序中的数据,那么一旦迁移的数据与作用域存储兼容,您就应该能够发布以API 30为目标的更新-https://developer.android.com/preview/privacy/storage#scoped-storage

如果用户跳过此版本并将其从先前版本直接更新为最新版本,并且您陷入无法访问的未迁移数据的困境,那么这可能会带来一些问题。

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

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

基于某些应用与File api交互的方式,有些应用可能根本无法成功迁移,因为Google的解决方案将无法涵盖所有​​当前用例,并且可能没有迁移路径

例如,我几年前发布了一个应用程序,该应用程序允许用户使用MediaStoreContentResolver更新专辑插图的数据,该数据存储在共享资源中。查看了Android 10+ aosp MediaProvider源代码后,似乎曾经使用MediaStore更新专辑插图以指向数据文件的应用不再起作用,这仅仅是因为MediaProvider内部在一个隐藏的.thumbnails文件夹中创建自己的插图,该文件夹直接查看mp3并使用MediaExtractor,而从不引用插入的引用插图的ContentValues。因此,即使您可以自己更新作品,查询MediaStore并查看它,其他应用也必须在api 29+中使用ContentResolver#loadThumbnail,因为它不会引用您的更新值,并且会延迟创建艺术品,或在.thumbnails文件夹中选择已生成的文件。显然,这些都没有得到记录,并且我的应用遭到了负面评价,引起了强烈反响,但是这些更改却打破了更改,完全超出了我的控制范围,使我查看了AOSP源代码,发现Android从根本上改变了行为。 / p>

(这不是胡言乱语,而是由于AOSP的根本无证行为,这些变化如何没有提供迁移路径的例子)。

,

https://developer.android.com/preview/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设备上强制执行旧存储。

,

在 2021 年初之前不要这样做(谷歌说):-

如果您想定位到 android 11,您应该使用 MANAGE_EXTERNAL_STORAGE 权限。

访问此页面了解更多详情:https://developer.android.com/training/data-storage/manage-all-files

,

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...