99网
您的当前位置:首页uniApp监听PDA扫描结果与主动触发PDA扫描头

uniApp监听PDA扫描结果与主动触发PDA扫描头

来源:99网
前提

将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是Android SDK中用于指定组件可以响应的意图类型的类

IntentFilter

导入了IntentFilter类之后,可通过IntentFilter变量创建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)
	})
},

因篇幅问题不能全部显示,请点此查看更多更全内容