基于uniapp实现监听PDA扫码功能,以霍尼韦尔(EDA50P)为例,可根据默认广播适配多厂商PDA【保姆级】

本文介绍了如何在不知晓PDA设备的扫码API时,通过配置广播和标签在Uniapp中监听PDA设备的扫描事件。包括如何在Honeywell设备上进行设置,获取设备品牌以及提供示例代码来实现扫描功能的初始化和停止。
摘要由CSDN通过智能技术生成

一. PDA设置

在不知道PDA设备扫码api的情况下,可通过配置广播和标签让程序进行监听。大多数pda设备默认不开启,需手动开启,以霍尼韦尔为例

  1. 进入设置找到《Honeywell设置》

在这里插入图片描述
2. 进入《扫描设置》

在这里插入图片描述
3. 进入《Internal Scanner》

在这里插入图片描述

  1. 添加配置

建议针对你开发的app进行单独配置,也可使用默认的配置文件【不建议】,使用默认配置(Default profile)的可以忽略此步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 进入配置打开《Data Processing Settings》
    在这里插入图片描述
  2. 最后一步勾选《Data Intent》

勾选后是厂家默认的广播动作和标签,点击《Data intent》可进入查看和重设
默认广播动作: com.honeywell.scan.broadcast
默认标签: data
也可根据需求自行修改

在这里插入图片描述
在这里插入图片描述
二. 获取PDA设备厂家用来区分不同设备

要知道什么pda的默认广播动作、标签字段 然后预设在代码里面来区分不同pda厂家 后面用对应的广播动作字段即可

uni.getSystemInfoSync().deviceBrand

三.uniapp实现监听PDA扫码功能【完整代码】

  1. 创建预设配置文件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])
	}

};
  1. 创建扫描功能文件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 事件,并传递扫描到的内容
};
  1. 项目中初始化扫码功能

可在扫码前置页面进行调用或者全局配置

onLoad() {
			// 将本设备的信息存入本地
			setCurrentDeviceAction();
			// 初始化
			initScan();
		},
  1. 页面中扫码功能使用
mounted() {
	// #ifndef H5
		initScan();
		startScan();
		uni.$on("SCAN_CODE", ({code}) => {
			// code就是扫码的结果 接下来写业务需求
		});
	// #endif
},
destroyed() {
	// #ifndef H5
	//页面销毁就取消接受扫码结果
	stopScan();
	// #endif
},

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Android PDA设备上,通常可以使用KeyEvent来监听PDA上的扫描按钮事件并获取扫描到的条码信息。以下是一个简单的示例代码: 首先,在AndroidManifest.xml文件中添加以下权限声明: ```xml <uses-permission android:name="android.permission.READ_PHONE_STATE" /> ``` 其中,权限"android.permission.READ_PHONE_STATE"用于获取设备状态。 然后,在MainActivity.java文件中实现监听PDA扫描按钮的逻辑: ```java public class MainActivity extends AppCompatActivity { private static final int SCAN_CODE = 139; private boolean isScanKeyDown = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 监听PDA扫描按钮 final Button btnScan = findViewById(R.id.btn_scan); btnScan.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getKeyCode() == SCAN_CODE) { if (event.getAction() == MotionEvent.ACTION_DOWN) { // 扫描按钮按下 isScanKeyDown = true; } else if (event.getAction() == MotionEvent.ACTION_UP) { // 扫描按钮松开 isScanKeyDown = false; } } return false; } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == SCAN_CODE) { // 扫描按钮按下 isScanKeyDown = true; return true; } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == SCAN_CODE) { // 扫描按钮松开 isScanKeyDown = false; return true; } return super.onKeyUp(keyCode, event); } @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == SCAN_CODE) { if (event.getAction() == KeyEvent.ACTION_DOWN) { // 扫描按钮按下 isScanKeyDown = true; return true; } else if (event.getAction() == KeyEvent.ACTION_UP) { // 扫描按钮松开 isScanKeyDown = false; return true; } } return super.dispatchKeyEvent(event); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { // 获取PDA扫描按钮状态 isScanKeyDown = isScanKeyDown(); } } private boolean isScanKeyDown() { try { InputManager inputManager = (InputManager) getSystemService(Context.INPUT_SERVICE); int[] deviceIds = inputManager.getInputDeviceIds(); for (int deviceId : deviceIds) { InputDevice inputDevice = inputManager.getInputDevice(deviceId); int sources = inputDevice.getSources(); if ((sources & InputDevice.SOURCE_KEYBOARD) == InputDevice.SOURCE_KEYBOARD) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { KeyCharacterMap keyCharacterMap = inputDevice.getKeyCharacterMap(); if (keyCharacterMap.getKeyboardType() == KeyCharacterMap.VIRTUAL_KEYBOARD) { return inputDevice.isKeyPressed(SCAN_CODE); } } else { return inputDevice.isKeyPressed(SCAN_CODE); } } } } catch (Exception e) { e.printStackTrace(); } return false; } } ``` 在上述代码中,我们首先在onCreate方法中监听PDA扫描按钮的Touch事件,并根据按钮按下/松开的状态来设置isScanKeyDown变量的值。 然后,我们重写了onKeyDown、onKeyUp和dispatchKeyEvent方法,分别在PDA扫描按钮按下、松开和发生事件时检测并设置isScanKeyDown变量的值。 另外,我们还重写了onWindowFocusChanged方法,在窗口获得焦点时获取PDA扫描按钮的状态,并设置isScanKeyDown变量的值。 最后,我们可以在其他地方根据isScanKeyDown变量的值来判断PDA扫描按钮是否按下,并根据需要获取扫描到的条码信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值