android 连接usb扫码枪

本文介绍了如何借助Android的AccessibilityService在没有界面的情况下捕获USB扫描枪的数据。通过监听KEYCODE_ENTER键触发的事件,结合ScannerGunService类,当扫描枪扫描条形码或二维码时,数据将被捕捉并在后台处理,例如显示在Toast上。这种方法适用于需要后台获取扫描数据的场景。
摘要由CSDN通过智能技术生成

Android 平板热插拔USB扫描枪应用场景多,在有界面如EditText时,扫描枪扫描内容自动输入到编辑框了,在没有界面的情况下,怎么拿到扫描枪数据呢?

本文类似Android平台抢微信红包思路,使用强大的AccessibilityService(Google为了让Android系统更实用,为用户提供了无障碍辅助服务),但需要到系统设置->无障碍->服务 开启当前服务。

对AccessibilityService不了解的同学看看http://www.jianshu.com/p/4cd8c109cdfb

关键:标准扫描枪扫描数据会触发KEYCODE_ENTER键,感兴趣的同学可以在onKeyEvent函数里打log,看看这个扫描过程中出发的keyCode和条形码(或二维码)内容比较。


处理很简单,ScannerGunService(继承AccessibilityService),代码如下:

package com.android.accessibility;
 
import com.android.accessibility.scanergun.ScannerGun;
import com.android.accessibility.scanergun.ScannerGun.ScannerGunCallBack;
 
import android.accessibilityservice.AccessibilityService;
import android.content.Intent;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.accessibility.AccessibilityEvent;
import android.widget.Toast;
 
public class ScannerGunService extends AccessibilityService {
 
    final static String TAG = "ScannerGunService";
    private ScannerGun mScannerGun = null;
 
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }
 
    @Override
    public void onAccessibilityEvent(AccessibilityEvent arg0) {
        // TODO Auto-generated method stub
 
    }
 
    @Override
    public void onInterrupt() {
        // TODO Auto-generated method stub
 
    }
 
    @Override
    protected boolean onKeyEvent(KeyEvent event) {
        // TODO Auto-generated method stub
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            int keyCode = event.getKeyCode();
            if (keyCode <= 6) {
                return false;
            }
            if (mScannerGun.isMaybeScanning(keyCode, event)) {
                return true;
            }
        }
        return super.onKeyEvent(event);
    }
 
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        mScannerGun = new ScannerGun(new ScannerGunCallBack() {
 
            @Override
            public void onScanFinish(String scanResult) {
                // TODO Auto-generated method stub
                if (!TextUtils.isEmpty(scanResult)) {
                    Toast.makeText(ScannerGunService.this.getBaseContext(),
                            "无界面监听扫描枪数据:" + scanResult, Toast.LENGTH_SHORT)
                            .show();
                }
            }
        });
        mScannerGun.setMaxKeysInterval(50);
        super.onCreate();
    }
 
}
连接扫码需要先确定扫码的接口类型,一般有USB接口和蓝牙接口。如果是USB接口,可以通过USB OTG线将扫码连接Android设备上;如果是蓝牙接口,可以在Android设备中搜索扫码并进行配对连接。 在Android Studio中,可以使用Android SDK中提供的API来读取扫码输入的数据。具体步骤如下: 1. 添加权限:在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.USB_PERMISSION" /> <uses-feature android:name="android.hardware.usb.host" /> ``` 2. 创建USB设备连接:使用UsbManager类创建USB设备连接,并请求USB设备权限。 ```java UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList(); Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); while (deviceIterator.hasNext()) { UsbDevice device = deviceIterator.next(); if (device.getVendorId() == VENDOR_ID && device.getProductId() == PRODUCT_ID) { PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); usbManager.requestPermission(device, permissionIntent); } } ``` 3. 接收扫码输入数据:使用UsbDeviceConnection类接收扫码输入数据。 ```java UsbDeviceConnection connection = usbManager.openDevice(device); if (connection != null && connection.claimInterface(interface, true)) { byte[] buffer = new byte[1024]; int length = connection.bulkTransfer(endpoint, buffer, buffer.length, TIMEOUT); if (length >= 0) { String data = new String(buffer, 0, length); // 处理扫码输入数据 } } ``` 以上是USB接口的连接方式,如果是蓝牙接口,可以使用BluetoothAdapter类进行连接。需要注意的是,不同型号的扫码连接方式可能会有所不同,具体请参考扫码的使用说明书。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值