2026.04.28今天我学习了如何使用pda进行广播读取扫码数据

一、通用组件

pda-scan.js

let mainActivity; // 运行时的主要活动activity
let intentFilter; // 实例化的意图过滤器
let broadcastReceiver; // 广播接收器
let repeatFlag = false;

// 初始化定义广播
const init = (onReceiveCallback) => {
    /* #ifdef APP-PLUS */
    if (typeof plus === 'undefined') {
        console.log('plus对象未准备好,无法初始化PDA扫描');
        return;
    }

    try {
        mainActivity = plus.android.runtimeMainActivity();
        const IntentFilter = plus.android.importClass('android.content.IntentFilter');
        intentFilter = new IntentFilter();

        intentFilter.addAction("android.intent.ACTION_DECODE_DATA");//不同pds设备需要修改的地方

        // 这里的 onReceive 就是文档里的 doReceive 函数
        broadcastReceiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
            onReceive: function (context, intent) {
                // ✅ 文档里的关键代码:导入intent类 + 取barcode_string
                plus.android.importClass(intent);
                var barcodeStr = intent.getStringExtra("barcode_string");//不同pds设备需要修改的地方

                console.log('✅ 扫码成功,结果:', barcodeStr);

                // 防重复
                if (repeatFlag) return;
                repeatFlag = true;
                setTimeout(() => repeatFlag = false, 150);

                // 把结果传给业务回调
                onReceiveCallback && onReceiveCallback(barcodeStr);
            }
        });

        setScannerMode(0); // 扫码模式设置(之前加的)
        console.log('PDA扫描初始化成功');
    } catch (error) {
        console.log('PDA扫描初始化失败:', error);
    }
    /* #endif */
};

// ------------------------------
// ✅ 新增:设置PDA扫码模式(你文档里的功能)
// mode: 0=自动模式  1=连扫模式  2=手动模式
// ------------------------------
const setScannerMode = (mode = 0) => {
    /* #ifdef APP-PLUS */
    try {
        const Intent = plus.android.importClass("android.content.Intent");
        const intent = new Intent("com.android.broadcast.uscanner.settings");

        // 文档固定写法
        intent.putExtra("keyInt", -13);
        intent.putExtra("valueInt", mode);

        mainActivity.sendBroadcast(intent);
        console.log(`✅ 已设置PDA扫码模式:${mode === 0 ? '自动模式' : mode === 1 ? '连扫模式' : '手动模式'}`);
    } catch (e) {
        console.log("设置扫码模式失败", e);
    }
    /* #endif */
};

// 开始广播监听扫码
const start = () => {
    /* #ifdef APP-PLUS */
    if (!mainActivity || !broadcastReceiver) return;
    try {
        mainActivity.registerReceiver(broadcastReceiver, intentFilter);
        console.log('PDA扫描监听已开始');
    } catch (error) {
        console.log('开始监听失败', error);
    }
    /* #endif */
};

// 停止广播监听扫码
const stop = () => {
    /* #ifdef APP-PLUS */
    try {
        mainActivity && broadcastReceiver && mainActivity.unregisterReceiver(broadcastReceiver);
    } catch (error) {
    }
    /* #endif */
};

// 主动触发扫描
const triggerScan = () => {
    /* #ifdef APP-PLUS */
    try {
        let Intent = plus.android.importClass("android.content.Intent");
        let intent = new Intent("com.scan.onStartScan");
        mainActivity.sendBroadcast(intent);
    } catch (error) {
    }
    /* #endif */
};

export const broadcastScan = {
    init,
    start,
    stop,
    triggerScan,
    setScannerMode, // 导出,外面也可以调用
};

二、页面使用

<template>
   <view></view>
</template>

<script>
import {broadcastScan} from '../../utils/pda-scan';
export default{
 data(){
     
  },
  onLoad(){
    broadcastScan.init(this.get_scan_code);//初始pda设备
    broadcastScan.setScannerMode(2);//手动模式
  },
  onShow() {
    broadcastScan.start();
  },
  onUnload() {
    broadcastScan.stop();
  },
  onHide() {
    broadcastScan.stop();
  },
  methods:{
    get_scan_code(code) {
      console.log(code,'扫描成功的值')
    },
  }
}
</script>

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐