调试的设备一定需要在扫描设置里,选择 intent输出,这样广播模式才会生效。
js文件模式:
创建scanCode.js文件,核心代码如下:
let main, receiver, filter;
let _httpLoading = false; // 请求的拦截变量
// 初始化--【扫码】
export const initScan = () => {
// #ifdef APP-PLUS
main = plus.android.runtimeMainActivity(); //获取主activity
let IntentFilter = plus.android.importClass("android.content.IntentFilter"); //获取android意图过滤类
filter = new IntentFilter(); //实例化意图过滤
filter.addAction('android.intent.ACTION_DECODE_DATA');//广播动作android.intent.ACTION_DECODE_DATA
receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
onReceive: function (context, intent) {
//这里获取intent.getAction(),会导致运行报错,如果需要查看当前广播动作是不是你需要的,试试这个方法:回调函数外 声明 var intent = main.getIntent();
plus.android.importClass(intent);
let code = intent.getStringExtra('barcode_string'); // 广播字符串数据标签
//如果需要字节数据标签的数据格式,可以intent.getExtra('barcode'),后续数据自行处理
queryCode(code)
}
});
// #endif
};
export const startScan = () => {
// #ifdef APP-PLUS
main.registerReceiver(receiver, filter); //开始监听广播
// #endif
};
export const stopScan = () => {
// #ifdef APP-PLUS
main.unregisterReceiver(receiver); //停止监听广播
uni.$off('SCAN_CODE'); //解绑uni全局监听事件
// #endif
};
const queryCode = (code) => {
// 有些PDA会自带换行符,trim函数处理下
code = code.trim()
if (_httpLoading) return;
_httpLoading = true;
setTimeout(() => {
_httpLoading = false
}, 200)
uni.$emit('SCAN_CODE', {
code
})
}
代码里,使用到的【广播动作】和【广播字符串数据标签】都可以在 扫描设置里–> intent输出块 获取到
使用方法如下:
1.在使用页面的created: initScan();
2.在使用到该功能的页面onShow()时:
startScan();
let _this = this
uni.$off('SCAN_CODE') //每次使用前,移除全局自定义事件监听器
uni.$on('SCAN_CODE', (res) => {
console.log('识别到的条形码是:===', res.code);
})
3.关闭
destroyed() {
stopScan(); //页面退出时一定要卸载监听,否则下次进来时会重复,造成扫一次出2个以上的结果
}
// 注意:使用的生命周期,对回调函数有影响。初始化方法尽量前置。如果监听不到广播的话,尝试把js方式变更为component方式,直接引入组件形式进行使用
如果需要设置扫码功能的其他设置(比如提示声音,振动,以及扫描的输入方式动态设置等),需要参考优博讯的【扫描文档】