前提
将PDA扫描头输出方式改为广播或Intent(不通DPA广播模式名称不同,有些为Intent),还需要广播开始与停止动作(有些PDA在助手里面没有,需要联系厂商)、广播动作、广播数据标签
1.注册、卸载广播(BroadcastReceiver)接收器(receiver)
main.registerReceiver(receiver, filter); //注册
main.unregisterReceiver(receiver); //卸载避免内存泄漏
2.获取主Activity
获取当前运行时的主 Activity 对象
main = plus.android.runtimeMainActivity();
3.设置广播接收器
3.1.导入Android SDK中的IntentFilter类
var IntentFilter = plus.android.importClass('android.content.IntentFilter');
filter = new IntentFilter();
plus.android.importClass | Cordova框架提供的方法,用于将Android SDK中的Java类导入到JavaScript中使用 |
android.content.IntentFilter() | 指定了要导入的Java类的完全限定名, |
IntentFilter | 导入了 |
3.2.设置广播接收器
filter.addAction(uni.getStorageSync('PDA_ACTION')); //通过addAction方法添加需要监听的广播
3.3实现广播接收器
receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
onReceive: function(context, intent) {
// 导入 intent 对象的相关类,使得你可以在后续代码中直接使用 intent.getStringExtra() 等方法,确保你可以在当前作用域内正确地使用 Android 平台提供的类和方法。
plus.android.importClass(intent);
// 处理接收到的广播数据
let code = intent.getStringExtra(uni.getStorageSync('PDA_DATA'));
// 调用方法处理接收数据
_this.queryCode(code);
}
});
queryCode: function(code) {
if (_codeQueryTag) return false;
_codeQueryTag = true;
setTimeout(function() {
_codeQueryTag = false;
}, 150);
var id = code
// 创建监听事件
uni.$emit('scan', {
code: id
})
}
BroadcastReceiver | 广播 |
io.dcloud.feature.internal.reflect.BroadcastReceiver | 用于实现 Android 广播接收器的功能 |
plus.android.implements() | 创建广播接收器对象 |
intent.getStringExtra() | 用于获取广播中携带的数据 |
onReceive | 用来在接收到特定广播时执行相应的逻辑 |
intent.getStringExtra(uni.getStorageSync('PDA_DATA')); | 用于JavaScript与Android通信,获取指定的数据 |
4.主动触发扫描头
that.main = plus.android.runtimeMainActivity();
//获取Android意图类
let Intent = plus.android.importClass('android.content.Intent');
//实例化意图
let intent = new Intent();
//定义意图,模拟按下L键,L键实际上是打开激光的物理键映射,由厂商提供
//改为从配置文件获取
intent.setAction(uni.getStorageSync('PDA_START'));
//有些DPA需要额外传参数触发,这里传参不影响不需要传参的PDA
intent.putExtra('keyInt', -11)
intent.putExtra('valueInt', 1)
//广播这个意图
that.main.sendBroadcast(intent);
// 每次进来先 移除全局自定义事件监听器
uni.$off('scan')
uni.$on('scan', async (data) => {
//扫码成功后的回调,写自己的逻辑代码在这里
console.log(data.code)
})
android.content.Intent | 是 Android 中用于描述应用程序之间或同一应用程序内部组件之间通信的对象,用于组件通信、Intent类型、数据传递、启动组件 |
setAction() | 设置广播动作 |
putExtra() | Android 中用于向 Intent 对象添加额外数据的方法,传参为键值对 |
sendBroadcast() | 发送广播 |
5.完成代码
5.1监听
<template>
<view class="content"></view>
</template>
<script>
var main, receiver, filter;
var _codeQueryTag = false;
export default {
data() {
return {
scanCode: ''
}
},
created: function(option) {
this.initScan()
this.startScan();
},
onHide: function() {
this.stopScan();
},
destroyed: function() {
this.stopScan();
},
methods: {
initScan() {
let _this = this;
main = plus.android.runtimeMainActivity();
var IntentFilter = plus.android.importClass('android.content.IntentFilter');
filter = new IntentFilter();
//下面的addAction内改为自己的广播动作
filter.addAction(uni.getStorageSync('PDA_ACTION'));
receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
onReceive: function(context, intent) {
// 导入 intent 对象的相关类,使得你可以在后续代码中直接使用 intent.getStringExtra() 等方法,确保你可以在当前作用域内正确地使用 Android 平台提供的类和方法。
plus.android.importClass(intent);
//下面的getStringExtra内改为自己的广播标签
let code = intent.getStringExtra(uni.getStorageSync('PDA_DATA'));
_this.queryCode(code);
}
});
},
startScan() {
main.registerReceiver(receiver, filter);
},
stopScan() {
main.unregisterReceiver(receiver);
},
queryCode: function(code) {
if (_codeQueryTag) return false;
_codeQueryTag = true;
setTimeout(function() {
_codeQueryTag = false;
}, 150);
var id = code
uni.$emit('scan', {
code: id
})
}
}
}
</script>
5.2主动触发
jpopupScan(){
let that = this;
//获取Android主Activity
that.main = plus.android.runtimeMainActivity();
//获取Android意图类
let Intent = plus.android.importClass('android.content.Intent');
//实例化意图
let intent = new Intent();
//定义意图,模拟按下L键,L键实际上是打开激光的物理键映射,由厂商提供
//改为从配置文件获取
intent.setAction(uni.getStorageSync('PDA_START'));
intent.putExtra('keyInt', -11)
intent.putExtra('valueInt', 1)
//广播这个意图
that.main.sendBroadcast(intent);
// 每次进来先 移除全局自定义事件监听器
uni.$off('scan')
uni.$on('scan', async (data) => {
//扫码成功后的回调,在这里写自己的逻辑代码
console.log(data.code)
})
},