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

在迁移到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,可以有效地管理文件访问权限和用户数据隐私。

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

相关·内容

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券