首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在迁移到Android Api级别29时,我收到这个错误,requestLegacyExternalStorage not found,failed processing manifest

在迁移到Android API级别29时,遇到requestLegacyExternalStorage not found错误,通常是因为在新版本的Android中,Google对存储访问框架(SAF)进行了一些重大更改,特别是引入了分区存储(Scoped Storage)的概念。以下是关于这个问题的基础概念、原因、解决方案以及相关应用场景的详细解释:

基础概念

分区存储(Scoped Storage)

  • 分区存储是一种新的存储模型,旨在提高用户数据的隐私和安全性。
  • 在API级别29及更高版本中,默认情况下,应用只能访问自己的私有目录和特定的媒体文件。

Legacy External Storage

  • 这是旧版本的存储模型,允许应用访问整个外部存储(如SD卡)。
  • requestLegacyExternalStorage标志用于在Android 10(API级别29)中暂时启用旧的存储模型。

错误原因

  • 在Android 10中,requestLegacyExternalStorage标志被引入,允许应用在迁移到分区存储时继续使用旧的存储模型。
  • 但是,在Android 11(API级别30)及更高版本中,这个标志已被移除,因此在新版本中无法找到这个属性。

解决方案

1. 更新Manifest文件

如果你仍然需要支持Android 10,并且希望在Android 11及以上版本中避免这个错误,可以在AndroidManifest.xml中进行如下配置:

代码语言:txt
复制
<manifest ...>
    <application
        ...
        android:requestLegacyExternalStorage="true"
        ... >
        ...
    </application>
</manifest>

2. 迁移到分区存储

长期来看,最好的解决方案是迁移到分区存储。以下是一些步骤:

  • 使用MediaStore API:访问共享媒体文件。
  • 使用Storage Access Framework (SAF):允许用户选择文件或目录进行访问。
  • 使用App-specific directories:访问应用私有的文件目录。

示例代码:使用MediaStore API保存图片

代码语言:txt
复制
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DISPLAY_NAME, "image_name.jpg");
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);

Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
try (OutputStream outputStream = getContentResolver().openOutputStream(uri)) {
    // 写入图片数据到outputStream
} catch (IOException e) {
    e.printStackTrace();
}

应用场景

  • 媒体文件管理:如照片、视频等。
  • 文档共享:允许用户选择并上传文件。
  • 备份和恢复:应用数据的备份和恢复操作。

总结

迁移到Android API级别29时遇到requestLegacyExternalStorage not found错误,主要是因为在新版本中移除了这个标志。建议逐步迁移到分区存储模型,以确保应用的兼容性和未来的稳定性。通过使用MediaStore API和Storage Access Framework,可以有效地管理文件访问权限和用户数据隐私。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

相册适配 Android 11 绕的那些弯路

在搭载 Android 9(API 级别 28)或更低版本的设备上,只要其他应用具有相应的存储权限,任何应用都可以访问外部存储空间中的应用专属文件。...: 注意:当您将应用更新为以 Android 11(API 级别 30)为目标平台后,如果应用在搭载 Android 11 的设备上运行,系统会忽略 requestLegacyExternalStorage...只适配 Android 10 (不推荐) 在Manifest中添加 <application   android:requestLegacyExternalStorage="true"   ...> 我们刚才知道了...好吧,看到了熟悉却又令人绝望的错误信息,依赖的播放器库抛出了熟悉的异常 java.io.FileNotFoundException open failed: EACCES (Permission denied...于是,在 Android 11 中,又做了兼容,又可以通过 Java File Api 的方式访问媒体库文件了(此时的我不知道是不是应该高兴,Android 确实比苹果爸爸对开发者好) 后来,我又仔细的翻了翻官方文档

1.7K30

Android-读写权限变更记录

相关知识点低版本的,我这里就不说明了Android 10(API 级别 29)开始,android.permission.WRITE_EXTERNAL_STORAGE 权限的行为发生了变化,这个权限默认情况下被视为无效...android:requestLegacyExternalStorage="true" 是一个用于在 Android 10(API 级别 29)及以上版本中启用传统外部存储权限模式的应用程序清单属性,Android...Android 11(API 级别 30) 中,读取媒体文件的权限受到了更严格的限制。...Android 11(API 级别 30)以后:android:requestLegacyExternalStorage="true" 开始无效了,但是可以通过permission.MANAGE_EXTERNAL_STORAGE...需要注意:在 Android 12 中,MANAGE_EXTERNAL_STORAGE 权限被修改为更高的保护级别,只有特定的系统应用程序才能获得这个权限,这是一个高危的权限。

1.9K21
  • 拖不得了,Android11真的来了,最全适配实践指南奉上

    看到这个新闻我知道我不能再拖了,再不好好准备好迎接Android11的到来,到时候迎接我的就是客户的指责,甚至老板的一封休书了 ?。...在targetSdkVersion = 29应用中,设置android:requestLegacyExternalStorage="true",就可以不启动分区存储,让以前的文件读取正常使用。...现在需要 APK 签名方案 v2 ⭐ “对于以 Android 11(API 级别 30)为目标平台,且目前仅使用 APK 签名方案 v1 签名的应用,现在还必须使用 APK 签名方案 v2 或更高版本进行签名...Firebase JobDispatcher 和 GCMNetworkManager “如果您的应用以 API 级别 30 或更高级别为目标平台,在搭载 Android 6.0(API 级别 23)或更高版本的设备上会停用...fdsan 检测错误处理文件描述符所有权的错误,例如 use-after-close 和 double-close。在 Android 11 中,fdsan 的默认模式发生了变化。

    7.1K340266

    干货 | Trip.com Android 11 适配之旅

    Google Play 商店在 2021 年第 3、4 季度正式加强对应用 targetSdkVersion 的限制,要求应用必须以 API 级别 30 (Android 11) 或更高版本为目标运行环境...作为第一个强制要求分区存储的 API 级别,Android 11无疑是近几年适配工作较为复杂的版本,各个 APP 的适配进度也被寄予期盼。...类似于API 29 的 requestLegacyExternalStorage 开关,在API 30 上也有一个停用分区存储的开关 preserveLegacyExternalStorage ,在第一期的适配中...如果直接使用的话,可能会遇到如下问题: unexpected element found in manifest> 此时我们需要升级 AGP 的版本,具体的限制如下: AGP 的升级同样是需要谨慎评估的...但变更很少不代表没有,例如我们也遇到了 xml 解析上面的一些问题,部分模块编译时报如下错误: Android resource linking failed 这是因为一部分自定义的 attr 没有显式声明其

    1.7K20

    AndroidR兼容性适配指南

    Android 11 存储常见问题解答 强制执行分区存储 在 Android 11 上运行但以 Android 10(API 级别 29)为目标平台的应用仍可请求 requestLegacyExternalStorage...,Android 11(API 级别 30)及更高版本允许您使用 MediaStore API 以外的 API 来访问共享存储空间中的媒体文件。...也许有小伙伴问到既然Android11可以直接使用File API访问媒体文件了,那分区存储这个适配还有必要么?(PS:我知道肯定有必要,但我想知道为什么会有必要?)...消息框回调 如果您希望在消息框(文本消息框或自定义消息框)出现或消失时收到通知,请使用 Android 11 中添加的 addCallback() 方法。...这个基本上就解决了大部分的分区存储的适配问题。而我们在Android10适配的时候又把相关的数据文件迁移到了应用的私有空间也可以通过File API进行文件访问。 最后呢!

    2.1K20

    Android 11 应用兼容性适配,看这篇就够了

    大家好,又见面了,我是你们的朋友全栈君。...地址限制 1 背景 在以 API 级别“30”及更高版本为目标平台的应用中,非特权应用(预置或系统应用)将无法访问设备的 MAC 地址;只有具有 IPv4 地址的网络接口可见。...3 适配指导 在相关业务中使用级别较高的ConnectivityManager API 而不是级别较低的NetworkInterface/getifaddrs() API。...在Android Q中,当进程出现重复操作已关闭文件描述符动作后,会打印错误信息帮助开发者定位问题。Android 11上,除打印异常信息外,进程会终止执行,更加严格。...上述列出了 Android 10(API 级别 29)中列入灰名单而目前在 Android 11 中受限的所有非 SDK 接口。

    13.1K42

    Android 11 开发者常见问题: 存储 | FAQ・第二期

    我们在 Android 10 中首次引入了 "分区存储" 的概念,旨在保护应用和用户数据并减少文件混乱。自此之后我们收到了开发者们的宝贵建议,这些建议有助于我们对该功能的持续优化,非常感谢大家!...在 Android 10 的设备上,除非在 manifest 中通过主动声明 requestLegacyExternalStorage 属性来选择停用分区存储,否则上述方法是无效的。...但是在随机读写的情境下,采取文件路径的方法最多可慢一倍。为了最快、最稳定的读写,我们推荐您使用 Media Store API。 我的应用需要广泛地访问共享存储,存储访问框架是我唯一的选择吗?...目标版本为 Android 11 (API 级别为 30) 并使用 SAF 的应用,将不会被授予某些目录访问权限,例如 SD 卡上的根目录和下载目录。...需要注意的是,在 Android 11 上这个标记对新安装的应用起不到任何作用。将目标版本设为 Android 11 之前,请修改代码以适配分区存储。

    1.1K10

    Android 12 自动适配 exported 深入解析避坑

    脚本 所以在之前的 《Android 12 快速适配要点》 一文中提供了一套脚本,专门用于适配 Android 12 下缺少 android:exported 无法编译或者安装的问题,但是在这期间收到了不少问题反馈...对应路径是 ProcessApplicationManifest -> MainfestHelper mergeManifestsForApplication -> MainfestMerger2 错误是在...Merging library manifest 的阶段出现异常,但是这个阶段的 task 里对于第三方依赖路径的输入,主要是从 private fun computeFullProviderList...: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed parse during installPackageLI: /data/app/vmdl487461761...,不得不说小米系统这个安装失败很具误导性,比如 minSDK 太高导致无法安装,在小米上也会是 INSTALL_FAILED_USER_RESTRICTED: image 基本上内容就这些,具体如何进一步优化还待后续测试

    1.6K30

    Android 10 和Android 11的适配

    在Android10 上公共目录下的图片无法通过file:// 格式去访问,提示找不到路径。如glide加载、图片选择库、裁剪框架等等都会收到影响。...我谢谢你啊~~) **我这里说的 Android10 和 android 11 是指 targetSdkVersion 哦 ** 2.1 往公共目录插入一张图片 只能通过mediaStore方式: ContentValues...三、终极适配方案 在Android10上 开启标志位 :android:requestLegacyExternalStorage="true"来开启兼容模式,关闭分区适配,相当于targetSdkVersion...最后,我还想问两个问题: 1. targetSdk=30,android:requestLegacyExternalStorage="false"运行在Android10的设备上 会咋么样?...2. targetSdk=30,android:requestLegacyExternalStorage="false"运行在Android11的设备上 会咋么样?

    1.4K41

    Android11 (API30)适配

    判断当前App运行模式 判断当前App运行什么模式,可以通过这个API判断: Environment.isExternalStorageLegacy() (added in api 29); 1.3.2...地址限制 1 背景 在以 API 级别“30”及更高版本为目标平台的应用中,非特权应用(预置或系统应用)将无法访问设备的 MAC 地址;只有具有 IPv4 地址的网络接口可见。...3 适配指导 在相关业务中使用级别较高的ConnectivityManager API 而不是级别较低的NetworkInterface/getifaddrs() API。...在Android Q中,当进程出现重复操作已关闭文件描述符动作后,会打印错误信息帮助开发者定位问题。Android 11上,除打印异常信息外,进程会终止执行,更加严格。...上述列出了 Android 10(API 级别 29)中列入灰名单而目前在 Android 11 中受限的所有非 SDK 接口。

    8K11

    AndroidQ兼容性适配指南

    Environment.isExternalStorageLegacy();//存储是否为兼容模式 在适配Android11的时候requestLegacyExternalStorage 标签会在Android11...4.4(API 级别 19)引入了存储访问框架Storage Access Framework (SAF)。...下面介绍自定义DocumentsProvider的步骤: API版本为19或者更高 在manifest.xml中注册该Provider Provider的name为类名加包名,比如: com.example.android.storageprovider.MyCloudProvider...在ota升级前,可以将APP 的用户历史数据通过MediaStore接口迁移到公共目录下。...允许其他应用访问,并且应用卸载后不允许删除的文件,文件需要存储在共享目录,应用可以选择是否进行目录整改,将文件迁移到 Androidq 要求的 media 集合目录。

    7.1K30

    干货 | 携程Android 10适配踩坑指南

    support-v4的意思就是这个库中提供的API会向下兼容到Android 1.6系统。...10(API 级别 29)及更高版本为目标平台的应用在默认情况下被赋予了对外部存储设备的分区访问权限(即分区存储), 对外部存储文件访问方式重新设计,便于用户更好的管理外部存储文件。...2.4.1 AndroidManifest中申明 tagretSDK 大于等于Android 10(API level 29), 在manifest中设置requestLegacyExternalStorage...manifest ...> ... android:requestLegacyExternalStorage="true" ... > ......允许其他应用访问,并且应用卸载后不允许删除的文件,文件需要存储在共享目录,应用可以选择是否进行目录整改,将文件迁移到Android10要求的media集合目录。

    3.3K77

    Android Studio 遇到问题集锦

    我遇到的原因是 Hyper-V 的影响,导致无法安装 HAXM,虽然在 msconfig 里查看我的 Hyper-V 服务都已经停止,我在 BIOS 里也已经 Enable 了 Virtualization...Technology 相关的选项,仍然报相同的错误。...(但诡异的是我后来改回 25 想复现一下,问题却不再出现了) Plugin with id ‘com.android.application’ not found 导入一个别人做的工程的时候遇到报错:...Generate JavaDoc 提示“错误: 编码GBK的不可映射字符” 所有相关文件的编码都是 UTF-8,在 Android Studio 里没有找到设置 JavaDoc 相关的编码设置项,于是在...编译报错 Error:Execution failed for task ‘:app:transformClassesWithDexForRelease’ 我这里的原因是一个 APP 依赖一个 Module

    6.8K20

    Multidex记录一:介绍和使用

    早期版本的构建系统按如下方式报告这一错误: Conversion to Dalvik format failed:Unable to execute dex: method ID not in [0,...Google官方:配置方法数超过 64K 的应用 Android 5.0 之前版本的 Dalvik 可执行文件分包支持 Android 5.0(API 级别 21)之前的平台版本使用 Dalvik 运行时来执行应用代码...Android 5.0 及更高版本的 Dalvik 可执行文件分包支持 Android 5.0(API 级别 21)及更高版本使用名为 ART 的运行时,后者原生支持从 APK 文件加载多个 DEX...,在运行时可能导致程序的崩溃,这个主要是因为Dalvik linearAlloc 的一个限制,这个限制在 Android 4.0 (API level 14)已经增加了, 应用也有可能在低于 Android...5.0 (API level 21)版本的机器上触发这个限制。

    1.7K10

    Android Studio 遇到问题集锦

    我遇到的原因是 Hyper-V 的影响,导致无法安装 HAXM,虽然在 msconfig 里查看我的 Hyper-V 服务都已经停止,我在 BIOS 里也已经 Enable 了 Virtualization...Technology 相关的选项,仍然报相同的错误。...(但诡异的是我后来改回 25 想复现一下,问题却不再出现了) Plugin with id ‘com.android.application’ not found 导入一个别人做的工程的时候遇到报错:...Generate JavaDoc 提示“错误: 编码GBK的不可映射字符” 所有相关文件的编码都是 UTF-8,在 Android Studio 里没有找到设置 JavaDoc 相关的编码设置项,于是在...编译报错 Error:Execution failed for task ‘:app:transformClassesWithDexForRelease’ 我这里的原因是一个 APP 依赖一个 Module

    5.4K30

    WebView深度学习(二)之全面总结WebView遇到的坑及优化

    级别 android:hardwareAccelerated="true"...> window级别(目前为止,Android还不支持在Window级别关闭硬件加速。)...﹕ Should not happen: no rect-based-test nodes found ◆◆ 解决方案: 这个问题的办法是继承WebView类,在子类覆盖onTouchEvent方法,...,可以使用和chrome浏览器类似的API来实现对恶意网站的检测来保护web浏览的安全性,为此需要在manifest中添加如下meta-data标签: manifest> manifest> WebView还增加了关于多进程的API,可以使用多进程来增强安全性和健壮性,如果render进程崩溃了,你还可以使用Termination Handler...当WebView加载出错时,我们会在WebViewClient实例中的onReceivedError()方法接收到错误,我们就在这里做些手脚: @Override public void onReceivedError

    6K30
    领券