uni-app中对优博讯和新大陆安卓(Android)PDA的条码扫码广播监听(带示例附件)

发布于 1周前 作者 caililin 来自 uni-app

uni-app中对优博讯和新大陆安卓(Android)PDA的条码扫码广播监听(带示例附件)
我们在开发的时候需要获取优博讯PDA的条码扫码内容,根据前人的分享及自己找的一些资料整理示例代码如下,希望能帮助到有需要的人。为了避免刚入门的人无从下手,特增加了附件。

以下是示例,真正在用的时候,建议在app启动之后就开始监听,并通过全局事件来推送给需要的页面,而不是在每个页面都自己去监听,有利于代码的维护和提升性能。全局事件的监听和释放可参考我的另一个帖子:关于uni-app全局事件监听和释放监听的分享

另外优博讯的PDA需要在系统的:设置->扫描->Default->关闭(键盘方式输出) 才能使用广播监听。

onLoad() {  

    page = this;  

    this.title = "开始监听!";  

    var main = plus.android.runtimeMainActivity(); //获取activity    
    var context = plus.android.importClass('android.content.Context'); //上下文    
    var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  
        onReceive: doReceive  
    });  
    var IntentFilter = plus.android.importClass('android.content.IntentFilter');  
    var Intent = plus.android.importClass('android.content.Intent');  
    var filter = new IntentFilter();  

    //针对优博讯安卓PDA-i6300A添加监听,其它优博讯的型号应该一样或类似  
    filter.addAction("android.intent.ACTION_DECODE_DATA"); //监听扫描  

    main.registerReceiver(receiver, filter); //注册监听    

    function doReceive(context, intent) {  

        //通过intent实例引入intent类,方便以后的‘.’操作    
        plus.android.importClass(intent);  

        //条码内容  
        var barcodeBytes = intent.getByteArrayExtra("barcode");  
        var barcode = byteToString(barcodeBytes);  

        //条码长度  
        var barcodeLength = intent.getIntExtra("length", 0);  
        //var myArray = new ArrayBuffer(0);  
        //条码类型  
        var barcodeTypeBytes = intent.getByteExtra("barcodeType", (0 | 0));  
        var barcodeType = byteToString(barcodeTypeBytes);  

        // uni.showModal({  
        //  content: '条码:' + barcode + '\r\n长度:' + barcodeLength + '\r\n类型:' + barcodeType,  
        //  showCancel: false  
        // });  
        page.title = barcode;  
        //console.log(barcode);    
        //main.unregisterReceiver(receiver);//取消监听    
    }  

    function byteToString(arr) {  
        if (typeof arr === 'string') {  
            return arr;  
        }  
        var str = '',  
            _arr = arr;  
        for (var i = 0; i < _arr.length; i++) {  
            var one = _arr[i].toString(2),  
                v = one.match(/^1+?(?=0)/);  
            if (v && one.length == 8) {  
                var bytesLength = v[0].length;  
                var store = _arr[i].toString(2).slice(7 - bytesLength);  
                for (var st = 1; st < bytesLength; st++) {  
                    store += _arr[st + i].toString(2).slice(2);  
                }  
                str += String.fromCharCode(parseInt(store, 2));  
                i += bytesLength - 1;  
            } else {  
                str += String.fromCharCode(_arr[i]);  
            }  
        }  
        return str;  
    }  

}

下面是新大陆PDA的扫码方式

//新大陆 智联天地 N7000R 获取方法  

//#ifdef APP-PLUS  

this.title = "开始监听!";  

var main = plus.android.runtimeMainActivity(); //获取activity    

var context = plus.android.importClass('android.content.Context'); //上下文    

var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  

    onReceive: doReceive  

});  

var IntentFilter = plus.android.importClass('android.content.IntentFilter');  

var Intent = plus.android.importClass('android.content.Intent');  

var filter = new IntentFilter();  

filter.addAction("com.android.server.scannerservice.broadcast"); //监听扫描  

main.registerReceiver(receiver, filter); //注册监听    

function doReceive(context, intent) {  

    //通过intent实例引入intent类,方便以后的‘.’操作    

    plus.android.importClass(intent);  

    var barcodeBytes1 = intent.getStringExtra("scannerdata");  

    console.log(page.openCustmerScan);  

    if (page.openCustmerScan) {  

        page.cylinderRecovery.customerId = barcodeBytes1  

    } else {  

        page.setval(barcodeBytes1)  

    }  

}  
//#endif

1 回复

在uni-app中实现对优博讯和新大陆安卓PDA的条码扫码广播监听,通常需要利用原生的Android功能,并通过uni-app提供的插件机制与原生代码进行交互。以下是一个简化的示例,展示如何通过自定义原生插件来实现这一功能。

步骤1:创建uni-app项目并添加原生插件

首先,确保你已经创建了一个uni-app项目。然后,创建一个新的原生插件目录,例如native-plugins/BarcodeScanner

步骤2:编写Android原生代码

native-plugins/BarcodeScanner目录下,创建以下文件:

BarcodeScannerPlugin.java

package com.example.barcodescanner;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.widget.Toast;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.common.UniModule;

public class BarcodeScannerPlugin extends UniModule {
    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String barcode = intent.getStringExtra("SCAN_RESULT");
            // 回调到uni-app前端
            getModuleContext().evaluateJavascript("yourJsFunctionName('" + barcode + "')");
        }
    };

    @Override
    public void init() {
        IntentFilter filter = new IntentFilter("com.example.SCAN_ACTION");
        getModuleContext().registerReceiver(receiver, filter);
    }

    @Override
    public void destroy() {
        getModuleContext().unregisterReceiver(receiver);
    }
}

步骤3:在uni-app中调用原生插件

manifest.json中配置插件:

"nativePlugins": [
    {
        "android": {
            "package": "com.example.barcodescanner.BarcodeScannerPlugin",
            "class": "BarcodeScannerPlugin"
        }
    }
]

pages/index/index.vue中调用插件:

<template>
  <view>
    <button @click="startScan">Start Scan</button>
  </view>
</template>

<script>
export default {
  methods: {
    startScan() {
      // 假设已经注册并初始化了插件
      uni.requireNativePlugin('BarcodeScannerPlugin').startScan();
    },
    yourJsFunctionName(barcode) {
      console.log('Scanned Barcode:', barcode);
      uni.showToast({
        title: 'Scanned: ' + barcode,
        icon: 'success'
      });
    }
  }
}
</script>

注意:上述代码示例为了简洁,省略了部分细节,如插件注册的具体实现、广播发送的具体机制(通常由PDA的条码扫描服务发送)等。实际项目中,需要根据PDA厂商提供的SDK或文档,进一步调整和完善代码。特别是广播的动作(com.example.SCAN_ACTION)和额外数据键(SCAN_RESULT)需根据PDA的实际实现进行调整。

回到顶部