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),而旧版应用需要此属性来保持对外部存储的传统访问方式。以下是解决方案:

步骤:

  1. manifest.json 文件中配置

    • 打开项目根目录下的 manifest.json 文件。
    • "app-plus" -> "distribute" -> "android" 部分添加 "requestLegacyExternalStorage": true

    示例代码:

    {
      "app-plus": {
        "distribute": {
          "android": {
            "requestLegacyExternalStorage": true
          }
        }
      }
    }
    
  2. 重新编译项目

    • 保存 manifest.json 文件后,重新运行或构建项目(例如通过 HBuilderX 或命令行执行 npm run build:app-plus)。

注意事项:

  • 此属性仅对 Android 10 及以上设备有效,且适用于 targetSdkVersion 29 或更高版本的应用。
  • 从 Android 11(API 级别 30)开始,此属性被废弃,建议迁移到分区存储(Scoped Storage)以遵循新的存储策略。
  • 如果问题持续,检查 HBuilderX 或 CLI 版本是否过旧,更新到最新版本以确保兼容性。

通过以上配置,可以解决未注册属性的问题,确保应用在 Android 10+ 设备上正常访问外部存储。

回到顶部