uni-app 离线SDK打包方式 华为、荣耀手机在targetSDK为30时 h5页面 input type=file 拍照无法返回照片
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),导致应用无法直接访问外部存储中的文件。
解决方案
-
调整
targetSDK
版本:- 将
targetSDK
降级到 29 或以下,以避免 Android 11 的 Scoped Storage 限制。但这只是临时的解决方案,因为 Google Play 要求应用在 2021 年 8 月之后必须使用targetSDK
30 或更高版本。
- 将
-
使用
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>
- 在
-
使用
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); } });
- 使用