uniapp实现pda的具体原理是在设备端需要开启广播模式,uniapp端通过调用方法来获取设备端扫描到的数据,从而在APP端对扫描的结果进行控制
一.首先打开手机的设置->扫描设置->输出模式->广播输出
.查看广播输出的配置信息
- 我的广播输出action是
nlscan.action.SCANNER_RESULT
- extra是
SCAN_BARCODE1
需要记录广播输出配置的action
和 extra
信息,在代码中这两个参数要对应哦
二.在你的uniapp项目里创建一个组件,叫scan-code吧,放在公共组件下面,目录为components/scan-code/scan-code.vue,页面代码如下:
<template>
<view class="content"></view>
</template>
<script>
export default {
data() {
return {
activity: null,
receiver: null,
intentFilter: null
}
},
created: function(option) {
this.initScan()
this.startScan();
},
onHide: function() {
this.stopScan();
},
destroyed: function() {
//页面退出时一定要卸载监听,否则下次进来时会重复,造成扫一次出2个以上的结果/
this.stopScan();
},
methods: {
initScan() {
let _this = this;
this.activity = plus.android.runtimeMainActivity(); //获取activity
var IntentFilter = plus.android.importClass('android.content.IntentFilter');
this.intentFilter = new IntentFilter();
this.intentFilter.addAction('nlscan.action.SCANNER_RESULT') // 换你的广播动作
this.receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
onReceive: function(context, intent) {
console.log("intent",intent)
plus.android.importClass(intent);
let content = intent.getStringExtra('SCAN_BARCODE1'); // 换你的广播标签
uni.$emit('scancodedate', content)
}
});
},
startScan() {
this.activity.registerReceiver(this.receiver, this.intentFilter);
},
stopScan() {
this.activity.unregisterReceiver(this.receiver);
}
}
}
</script>
<style>
</style>
引入自定义组件scan-code.vue
<template>
<view>
<view>你的页面内容</view>
<view v-for="item in content">{{item}}</view>
<pda-scan></pda-scan>
</view>
</template>
<script>
import scanCode from '@/components/scan-code/scan-code.vue';
export default {
components: { scanCode },
data() {
return {
content: []
}
},
onLoad() {
var _this = this
uni.$on('scancodedate', function(content) {
console.log("扫描到的内容为:", content)
_this.content.push(content)
})
}
}
</script>
三个步骤完成后,最好是用真机测试,只需要启动项目,打开存在app后,直接使用设备终端的扫描功能就能得到响应啦!!!