【解决】PDA手持终端后置摄像头扫码及激光扫码实现(uniapp、Android、app)
最近在使用uniapp开发一款PDA端的app,遇到扫码的需求。

需求:
不仅支持后置摄像头扫码,还要支持PDA顶部激光扫码,根据拿到的结果进行后续操作。
二维码格式如下(示例):
{'type':'AA','code': '666'
}
①后置摄像头调用方式(uniapp):
// 需要扫码的位置给一个事件,触发该方法
<view @click="scanCode"></view>
// methods中写入以下两方法
// 事件执行代码如下
scanCode () {uni.scanCode({// 是否只能从相机扫码,不允许从相册选择图片(详见下方官网链接 )onlyFromCamera: true,success: (res) => {// res.result为上述二维码格式const handleRes = JSON.parse(res.result);// 调用成功后,执行下一步方法this.judgeType(handleRes);}})
},
// 判断类型
judgeType (handleRes) {// 判断typeif (handleRes.type === 'AA') {// TODO...} else {// TODO...}
},
备注:uni-app调用摄像头【官方】
②机器顶部激光扫码调用方式:
- 先创建扫码组件,全局注册或单页面引入,示例代码如下(Android):
<template><view class="content"></view>
</template>
<script>export default {data() {return {main: ''}},onHide:function(){if(uni.getSystemInfoSync().platform === 'android') {this.stopScan();}},destroyed:function(){// 页面退出时一定要卸载监听,否则下次进来时会重复,造成扫一次出2个以上的结果if(uni.getSystemInfoSync().platform === 'android') {this.stopScan();}},created() {if(uni.getSystemInfoSync().platform === 'android') {this.init();}},methods: {init() {this.main = plus.android.runtimeMainActivity(); //获取activitylet context = plus.android.importClass('android.content.Context'); //上下文let receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {onReceive: this.doReceive});this.receiver = receiver;let IntentFilter = plus.android.importClass('android.content.IntentFilter');let Intent = plus.android.importClass('android.content.Intent');let filter = new IntentFilter();filter.addAction("nlscan.action.SCANNER_RESULT"); //监听扫描,根据设备的广播动作进行更换// filter.addAction("android.intent.action.SCANRESULT"); //监听扫描,根据设备的广播动作进行更换this.doS(receiver, filter);},doS(receiver, filter) {this.main.registerReceiver(receiver, filter);},doReceive(context, intent) {//通过intent实例引入intent类,方便以后的‘.’操作plus.android.importClass(intent);let barcodeData = intent.getStringExtra("SCAN_BARCODE1"); //获取扫描结果// let barcodeData = intent.getStringExtra("value"); //获取扫描结果let barcodeType = intent.getIntExtra("SCAN_BARCODE_TYPE", -1); //获取扫码类型uni.$emit('scanCodeData',{ code: barcodeData })},stopScan(){this.main.unregisterReceiver(this.receiver);},}}
</script><style>.content {text-align: center;}
</style>
- 在页面中使用,示例代码如下(一定注意要销毁):
mounted(){// 不需要点击触发,在mounted中监听即可,当用户按下PDA上面的激光按钮时,会触发uni.$on('scanCodeData', data => {let str = `${data.code}`;let recData = eval('(' + str + ')');this.getBatchA(recData)});
},
// methods中写入以下方法
getBatchA (recData) {// 判断typeif (recData.type === 'AA') {// TODO...} else {// TODO...}
},
// 及时销毁
beforeDestroy(){uni.$off('scanCodeData');
},
【解决】
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
