1. 项目需求
我们项目采购了Seuic东集CRUISE Ge-X3 工业级智能手机(PDA),PDA设备是Android9系统,带有激光扫码灯,现在要使用uniapp开发安卓程序,并实现在PDA设备上的激光扫码程序。
2. 前置条件
-
确保扫描工具已经正常启动,并在扫描工具中的设置-开发者选项中-获取指定的广播名称、键值名称等数据
-
pda特色设置中关闭《禁止将扫描按键的键值传递给应用》的选项
3. 代码实现
激光扫码是硬解的方案,扫码的速度远高于需要唤醒过程的摄像头扫码方式,激光扫码几乎可以实时返回结果。不过其依赖Android 8以上的版本才可以通过广播的方式被应用监听,因此在开发的过程中会造成一些阻碍。无论是原生的Android开发方式,还是像uni-app的跨平台解决方案,都需要在激光扫描模块获取到结果后向系统发出一条广播,接着可以通过应用监听广播的方式来获取扫码结果。
下面是扫码的scanCode.js
文件内容:
// pda的特色设置中需要关闭-禁止将扫描按键的键值传递给应用的开关
let mainActivity; // 运行时的主要活动activity
let intentFilter; // 实例化的意图过滤器
let broadcastReceiver; // 广播接收器
let repeatFlag = false;
// 初始化定义广播
const init = (onReceiveCallback) => {
/* #ifdef APP-PLUS */
// 获取activity
mainActivity = plus.android.runtimeMainActivity();
// 导入类
const IntentFilter = plus.android.importClass('android.content.IntentFilter');
//实例化一个意图过滤器
intentFilter = new IntentFilter();
// addAction添加动作, com.android.server.scannerservice.broadcast为设备配置的广播名称
intentFilter.addAction("com.android.server.scannerservice.broadcast");
// BroadcastReceiver广播接收器接口:implements 实现接口 onReceive实现接口的方法
broadcastReceiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
onReceive: function(context, intent) {
plus.android.importClass(intent);
// 扫描设置的开发者选项--手持机pda的广播键值scannerdata
const code = intent.getStringExtra("scannerdata");
console.log('pda原始扫描数据:', code