uni-app 安卓10上传不了图片 targetSdkVersion>=29以上

uni-app 安卓10上传不了图片 targetSdkVersion>=29以上

操作步骤:

  • 使用VantUI上传图片组件

预期结果:

  • 使用VantUI上传图片组件

实际结果:

  • 使用VantUI上传图片组件造成安卓10选中图片上传不了

bug描述:

安卓10上传不了图片,能进入相册,但是选中图片无效

说是修改androidmanifest.xml文件,在<application>标签里再添加一个属性android:requestLegacyExternalStorage="true",就行。但是云打包不支持加该属性。把targetSdkVersion设置为29以下的确可以。


更多关于uni-app 安卓10上传不了图片 targetSdkVersion>=29以上的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 安卓10上传不了图片 targetSdkVersion>=29以上的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这个问题是由于Android 10(API 29)引入的存储权限策略变更(Scoped Storage)导致的。当targetSdkVersion设置为29及以上时,应用默认无法直接通过文件路径访问外部存储中的文件,包括相册中的图片。

核心原因: Android 10及以上版本限制了应用对外部存储的访问权限,除非应用声明了requestLegacyExternalStorage属性或使用新的存储访问API(如MediaStore)。云打包时,HBuilderX默认生成的配置可能未包含此属性,导致上传组件无法获取到选中的图片文件。

解决方案:

  1. 临时方案(不推荐长期使用):

    • targetSdkVersion降级到28或以下(如你所述),但这不符合Google Play上架要求,且未来可能被强制要求升级。
  2. 推荐方案(适配Android 10+):

    • 使用uni-app的API进行文件选择,而非依赖UI组件的原生路径。例如:
      uni.chooseImage({
          count: 1,
          success: (res) => {
              const tempFilePaths = res.tempFilePaths;
              // 使用tempFilePaths上传(uni.uploadFile)
          }
      });
      
      uni.chooseImage已适配Scoped Storage,返回的临时路径可安全用于上传。
  3. 原生配置适配(如需自定义原生逻辑):

    • 若必须修改原生配置,可在HBuilderX项目的manifest.json中配置:
      "app-plus": {
          "distribute": {
              "android": {
                  "targetSdkVersion": 29,
                  "permissionExternalStorage": {
                      "request": "always"
                  }
              }
          }
      }
回到顶部