uni-app barcode卡死及uni.scanCode首次获取相册权限后返回扫码页面卡死问题
uni-app barcode卡死及uni.scanCode首次获取相册权限后返回扫码页面卡死问题
产品分类:
uniapp/App
PC开发环境操作系统:
Windows
PC开发环境操作系统版本号:
win11
HBuilderX类型:
正式
HBuilderX版本号:
3.98
手机系统:
Android
手机系统版本号:
Android 14
手机厂商:
华为
手机机型:
iphone se
页面类型:
vue
vue版本:
vue2
打包方式:
云端
项目创建方式:
HBuilderX
示例代码:
<barcode id='1' autostart='true' class="barcode" ref="barcode" background="rgb(0,0,0)" frameColor="#1C86EE"
scanbarColor="#1C86EE" @marked="success1" @error="fail1"></barcode>
setPhoto() {
let _this = this;
if (!_this.fils) {
_this.fils = true;
} else {
_this.fils = false;
}
uni.chooseImage({
count: 1, //默认9
sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
sourceType: ['album'], //从相册选择
success: function(res) {
console.log(JSON.stringify(res.tempFilePaths));
},
complete: function(res) {
_this.fils = false;
// _this.toStart();
}
});
},
操作步骤:
- 使用barcode选择autostart自动扫码
预期结果:
- 跳转页面返回不卡死,相册返回不卡死
实际结果:
- 全部都卡死,除非退出扫码页面重新进入
bug描述:
barcode使用autostart后进入扫码页面是可以正常扫码的,如果使用uni.navigateTo跳转页面后返回将会卡死,使用相册在相册选择其中一张图片后返回页面也会卡死
3 回复
每次返回都没有调用到相机权限应该是这个问题
这个问题我新建一个hello uniapp的项目也是一样可以复现,每次都将hbuilderx的缓存给清除就都可以复现
在使用 uni-app
进行开发时,可能会遇到 uni.scanCode
扫码功能在获取相册权限后返回扫码页面卡死的问题,或者在使用条形码扫描功能时出现卡死的情况。以下是一些可能的原因和解决方案:
1. 获取相册权限后返回扫码页面卡死问题
可能原因:
- 权限获取后的回调处理不当:在获取相册权限后,可能没有正确处理回调,导致页面卡死。
- 页面生命周期问题:在获取权限后,页面可能没有正确重新加载或初始化。
解决方案:
- 确保权限获取后的回调处理正确:在获取相册权限后,确保正确处理回调,并重新初始化扫码页面。
- 检查页面生命周期:确保在获取权限后,页面能够正确重新加载或初始化。
uni.authorize({
scope: 'scope.album',
success: () => {
// 权限获取成功,重新初始化扫码页面
uni.scanCode({
success: (res) => {
console.log('扫码结果:', res.result);
},
fail: (err) => {
console.error('扫码失败:', err);
}
});
},
fail: (err) => {
console.error('获取相册权限失败:', err);
}
});
2. 条形码扫描功能卡死问题
可能原因:
- 扫码组件或API使用不当:可能在使用
uni.scanCode
或相关扫码组件时,参数设置不当或未正确处理回调。 - 设备兼容性问题:某些设备可能存在兼容性问题,导致扫码功能卡死。
解决方案:
- 检查扫码API的使用:确保
uni.scanCode
的参数设置正确,并正确处理成功和失败的回调。 - 处理设备兼容性问题:在出现卡死问题时,尝试在不同的设备上进行测试,或者使用其他扫码库进行替代。
uni.scanCode({
onlyFromCamera: false, // 是否只允许从相机扫码
scanType: ['barCode', 'qrCode'], // 扫码类型
success: (res) => {
console.log('扫码结果:', res.result);
},
fail: (err) => {
console.error('扫码失败:', err);
}
});