uniapp中如何解决未注册android:requestlegacyexternalstorage="true"属性的问题
在uniapp开发中,当targetSdkVersion设置为30及以上时,应用会默认启用分区存储(Scoped Storage)。如果某些功能需要访问外部存储但未添加android:requestLegacyExternalStorage="true"属性,可能会导致文件读写失败。请问应该如何正确配置这个属性?是在manifest.json中设置,还是需要修改原生AndroidManifest.xml文件?具体操作步骤是什么?
2 回复
在manifest.json的app-plus节点下添加:
"distribute": {
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>"
]
}
}
这样会自动包含requestLegacyExternalStorage属性。
在 UniApp 中,如果遇到未注册 android:requestLegacyExternalStorage="true" 属性的问题,通常是因为 Android 10(API 级别 29)及以上版本引入了分区存储(Scoped Storage),而旧版应用需要此属性来保持对外部存储的传统访问方式。以下是解决方案:
步骤:
-
在
manifest.json文件中配置:- 打开项目根目录下的
manifest.json文件。 - 在
"app-plus" -> "distribute" -> "android"部分添加"requestLegacyExternalStorage": true。
示例代码:
{ "app-plus": { "distribute": { "android": { "requestLegacyExternalStorage": true } } } } - 打开项目根目录下的
-
重新编译项目:
- 保存
manifest.json文件后,重新运行或构建项目(例如通过 HBuilderX 或命令行执行npm run build:app-plus)。
- 保存
注意事项:
- 此属性仅对 Android 10 及以上设备有效,且适用于 targetSdkVersion 29 或更高版本的应用。
- 从 Android 11(API 级别 30)开始,此属性被废弃,建议迁移到分区存储(Scoped Storage)以遵循新的存储策略。
- 如果问题持续,检查 HBuilderX 或 CLI 版本是否过旧,更新到最新版本以确保兼容性。
通过以上配置,可以解决未注册属性的问题,确保应用在 Android 10+ 设备上正常访问外部存储。

