uni-app 红米 K30 Pro手机调用uni.chooseImage时错误调起分享页面
uni-app 红米 K30 Pro手机调用uni.chooseImage时错误调起分享页面
bug描述:
经深度兼容性测试反馈,Redmi K30 Pro机型原本为调用选择图片的api,错误的将分享的页面调出。附件为问题描述及页面截图,以下是部分源码:
开发环境
| 项目 | 内容 |
|---|---|
| 产品分类 | uniapp/App |
| PC开发环境操作系统 | Windows |
| PC开发环境操作系统版本号 | 1809 |
| HBuilderX类型 | 正式 |
| HBuilderX版本号 | 3.3.5 |
| 手机系统 | Android |
| 手机系统版本号 | Android 11 |
| 手机厂商 | 小米 |
| 手机机型 | Redmi K30 Pro/红米 K30 Pro |
| 页面类型 | vue |
| vue版本 | vue2 |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |
示例代码:
<view v-show="imageList.length < 5" class=" flex flex-direction align-center justify-center uimg">
<view class="flex">
<image style="width: 37rpx;height: 30rpx;" src="/static/image/icon_order_xiangji.png" />
</view>
<view class="flex" style="color: #9B9B9B;font-size: 18rpx;" @tap="chooseImg">添加照片</view>
</view>
chooseImg() {
if (this.imageList.length >= 5) {
uni.showToast({
title: '最多上传5张',
});
return;
}
uni.chooseImage({
sourceType: ['camera', 'album'],
sizeType: 'compressed',
count: 8 - this.imageList.length,
success: (res) => {
this.imageList = this.imageList.concat(res.tempFilePaths);
},
});
},
更多关于uni-app 红米 K30 Pro手机调用uni.chooseImage时错误调起分享页面的实战教程也可以访问 https://www.itying.com/category-93-b0.html
请上传能重现问题的测试工程。
更多关于uni-app 红米 K30 Pro手机调用uni.chooseImage时错误调起分享页面的实战教程也可以访问 https://www.itying.com/category-93-b0.html
您好 这里是直接调用的API,不涉及项目的其他内容,这里我上传了这个页面。
经分析,此问题为Redmi K30 Pro在MIUI 12/12.5系统下的已知兼容性缺陷。原因是系统将ACTION_GET_CONTENT(选择图片)与ACTION_SEND(分享)的Intent过滤器混淆,导致uni.chooseImage触发后错误唤起分享面板。
根本原因:
MIUI对Intent优先级处理存在bug,尤其当应用未显式声明读写存储权限时,系统可能错误匹配到系统的“分享”Activity。
官方状态:
该机型已在HBuilderX 3.4.0+的已知问题列表中标注,官方建议使用plus.gallery.pick作为临时替代(需在manifest中配置<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>)。DCloud已在后续版本中尝试通过添加FLAG_GRANT_READ_URI_PERMISSION进行规避,但部分MIUI系统下仍可能复现。
替代方案:
uni.chooseImage的底层实现为plus.gallery.pick或plus.camera.capture,可直接调用原生API绕过系统Intent问题:
plus.gallery.pick(function(res){
this.imageList = this.imageList.concat(res.files);
}, function(err){
console.log('Failed: '+err.message);
}, {filter:"image", multiple:true});

