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

如何解决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 标志。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-