uni-app 离线SDK打包方式 华为、荣耀手机在targetSDK为30时 h5页面 input type=file 拍照无法返回照片

发布于 1周前 作者 gougou168 来自 Uni-App

uni-app 离线SDK打包方式 华为、荣耀手机在targetSDK为30时 h5页面 input type=file 拍照无法返回照片

开发环境 版本号 项目创建方式
Windows 11 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Windows

PC开发环境操作系统版本号:11

HBuilderX类型:正式

HBuilderX版本号:3.98

手机系统:Android

手机系统版本号:Android 10

手机厂商:华为

手机机型:mate10pro

页面类型:vue

vue版本:vue2

打包方式:离线

App下载地址或H5网址:https://xg.wuyehao.com:9000/mobile/apk/app

示例代码:

h5页面  
<input @change="h5_chooseImage($event, 1)" type="file" accept="image/*" />  

h5_chooseImage:function($input, fileListType){  
    var file = $input.target.files[0];  
    var reader = new FileReader();  
    reader.readAsDataURL(file);  
    reader.onload=function(img){  
        // targetSDK30时 华为、荣耀手机拍照时不会进入回调。选择文件可进入  
                     // targetSDK28时,全部机型都正常  
    }  
}
`

2 回复

请问解决了吗,我也有这个问题,自定义基座调试都不触发


uni-app 中,当使用离线 SDK 打包应用时,如果 targetSDK 设置为 30(即 Android 11),在华为和荣耀手机上,input type="file" 拍照功能可能无法返回照片。这是由于 Android 11 引入了更严格的存储权限管理(Scoped Storage),导致应用无法直接访问外部存储中的文件。

解决方案

  1. 调整 targetSDK 版本

    • targetSDK 降级到 29 或以下,以避免 Android 11 的 Scoped Storage 限制。但这只是临时的解决方案,因为 Google Play 要求应用在 2021 年 8 月之后必须使用 targetSDK 30 或更高版本。
  2. 使用 FileProvider

    • AndroidManifest.xml 中配置 FileProvider,以便应用可以访问拍摄的照片。
    • 示例配置:
      <provider
          android:name="androidx.core.content.FileProvider"
          android:authorities="${applicationId}.fileprovider"
          android:exported="false"
          android:grantUriPermissions="true">
          <meta-data
              android:name="android.support.FILE_PROVIDER_PATHS"
              android:resource="@xml/file_paths" />
      </provider>
    • res/xml/file_paths.xml 中定义文件路径:
      <?xml version="1.0" encoding="utf-8"?>
      <paths xmlns:android="http://schemas.android.com/apk/res/android">
          <external-path name="external_files" path="." />
      </paths>
  3. 使用 uni.chooseImage API

    • 使用 uni-app 提供的 uni.chooseImage API 来选择或拍摄照片,而不是直接使用 input type="file"
    • 示例代码:
      uni.chooseImage({
          count: 1, // 默认9
          sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
          sourceType: ['camera'], // 可以指定来源是相册还是相机,默认二者都有
          success: function (res) {
              var tempFilePaths = res.tempFilePaths;
              console.log(tempFilePaths);
          }
      });
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!