在迁移到Android API级别29时,遇到requestLegacyExternalStorage not found
错误,通常是因为在新版本的Android中,Google对存储访问框架(SAF)进行了一些重大更改,特别是引入了分区存储(Scoped Storage)的概念。以下是关于这个问题的基础概念、原因、解决方案以及相关应用场景的详细解释:
分区存储(Scoped Storage):
Legacy External Storage:
requestLegacyExternalStorage
标志用于在Android 10(API级别29)中暂时启用旧的存储模型。requestLegacyExternalStorage
标志被引入,允许应用在迁移到分区存储时继续使用旧的存储模型。如果你仍然需要支持Android 10,并且希望在Android 11及以上版本中避免这个错误,可以在AndroidManifest.xml
中进行如下配置:
<manifest ...>
<application
...
android:requestLegacyExternalStorage="true"
... >
...
</application>
</manifest>
长期来看,最好的解决方案是迁移到分区存储。以下是一些步骤:
示例代码:使用MediaStore API保存图片
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元无门槛券
手把手带您无忧上云