一. PDA设置
在不知道PDA设备扫码api的情况下,可通过配置广播和标签让程序进行监听。大多数pda设备默认不开启,需手动开启,以霍尼韦尔为例
- 进入设置找到《Honeywell设置》
2. 进入《扫描设置》
3. 进入《Internal Scanner》
- 添加配置
建议针对你开发的app进行单独配置,也可使用默认的配置文件【不建议】,使用默认配置(Default profile)的可以忽略此步骤
- 进入配置打开《Data Processing Settings》
- 最后一步勾选《Data Intent》
勾选后是厂家默认的广播动作和标签,点击《Data intent》可进入查看和重设
默认广播动作: com.honeywell.scan.broadcast
默认标签: data
也可根据需求自行修改
二. 获取PDA设备厂家用来区分不同设备
要知道什么pda的默认广播动作、标签字段 然后预设在代码里面来区分不同pda厂家 后面用对应的广播动作字段即可
uni.getSystemInfoSync().deviceBrand
三.uniapp实现监听PDA扫码功能【完整代码】
- 创建预设配置文件PresetsPda.js
const deviceBrand = uni.getSystemInfoSync().deviceBrand;
// 目前已知的广播动作和广播标签 后续可继续叠加
// 自定义广播动作和标签也可进行预设
export const actionData = [{
// 霍尼韦尔(默认广播和标签)
deviceBrand: 'mobiwire',
action: 'com.honeywell.scan.broadcast',
stringExtra: 'data',
},
{
// 优博讯(默认广播和标签)
deviceBrand: 'urovo',
action: 'android.intent.ACTION_DECODE_DATA',
stringExtra: 'barcode_string',
}
]
// 首页进入页面 将本设备的信息存入本地 如果该厂商没在预设中 就拿第一个位置的配置,根据项目中使用的PDA自行决定
export const setCurrentDeviceAction = () => {
// 如果本地有存广播信息 就不拿了
if (uni.getStorageSync('currentDeviceData')?.deviceBrand) return
const data = actionData.find(item => deviceBrand === item.deviceBrand)
if (data && Object.keys(data).length) {
uni.setStorageSync('currentDeviceData', data)
} else {
uni.setStorageSync('currentDeviceData', actionData[0])
}
};
- 创建扫描功能文件scanModule.js
let main, receiver, filter;
let _codeQueryTag = false; // 标记变量
export const initScan = () => {
main = plus.android.runtimeMainActivity(); // 获取主 activity
var IntentFilter = plus.android.importClass("android.content.IntentFilter");
filter = new IntentFilter();
const action = uni.getStorageSync('currentDeviceData').action // 获取动作
const stringExtra = uni.getStorageSync('currentDeviceData').stringExtra // 获取字符串额外参数
filter.addAction(action); // 添加广播动作
receiver = plus.android.implements(
"io.dcloud.feature.internal.reflect.BroadcastReceiver",
{
onReceive: function (context, intent) {
plus.android.importClass(intent);
let code = intent.getStringExtra(stringExtra); // 获取广播中的字符串额外参数
queryCode(code);
},
}
);
};
export const startScan = () => {
main.registerReceiver(receiver, filter); // 开始监听广播
};
export const stopScan = () => {
main.unregisterReceiver(receiver); // 停止监听广播
// 解绑 uni 全局事件监听器,否则可能会出错
uni.$off('SCAN_CODE');
};
export const queryCode = (code) => {
// 防止重复查询
if (_codeQueryTag) return false;
_codeQueryTag = true; // 标记为已经查询
setTimeout(function () {
_codeQueryTag = false; // 重置标记
}, 150);
var id = code;
//id 就是扫码的结果
uni.$emit("SCAN_CODE", { code: id }); // 触发 SCAN_CODE 事件,并传递扫描到的内容
};
- 项目中初始化扫码功能
可在扫码前置页面进行调用或者全局配置
onLoad() {
// 将本设备的信息存入本地
setCurrentDeviceAction();
// 初始化
initScan();
},
- 页面中扫码功能使用
mounted() {
// #ifndef H5
initScan();
startScan();
uni.$on("SCAN_CODE", ({code}) => {
// code就是扫码的结果 接下来写业务需求
});
// #endif
},
destroyed() {
// #ifndef H5
//页面销毁就取消接受扫码结果
stopScan();
// #endif
},