Android 设备蓝牙连接扫描枪获取扫描内容

标签(空格分隔): 未分类


条形扫描枪主要可以扫描条形码和二维码等,扫描速度比手机扫描设备快得多,本文简单介绍android 通过蓝牙监听蓝牙连接,当扫描设备连接完成后,扫描设备相当于外接键盘,通过监听外接键盘输入事件,获取扫描出的内容。
其他参照文档:https://blog.csdn.net/czhpxl007/article/details/50363766


1.蓝牙配对

打开系统设置,蓝牙配对扫描枪, 一般扫描枪说明书都有写,配对完成后,显示已连接

2.AndroidManifest中配置权限

在中配置蓝牙连接所需要的权限

                

3.获取设备信息,判断是否连接

这里蓝牙设备返回的设备类型是BluetoothClass.Device.Major.PERIPHERAL

   /**     * 扫描枪是否连接     * @return     */    public boolean hasScanGun() {        if (mBluetoothAdapter == null) {            return false;        }        Set blueDevices = mBluetoothAdapter.getBondedDevices();        if (blueDevices == null || blueDevices.size() <= 0) {            return false;        }        for (Iterator iterator = blueDevices.iterator(); iterator.hasNext(); ) {            BluetoothDevice bluetoothDevice = iterator.next();            if (bluetoothDevice.getBluetoothClass().getMajorDeviceClass() == BluetoothClass.Device.Major.PERIPHERAL) {                mDeviceName = bluetoothDevice.getName();                return isInputDeviceExist(mDeviceName);            }        }        return false;    }    /**     * 输入设备是否存在     * @param deviceName     * @return     */    private boolean isInputDeviceExist(String deviceName) {        int[] deviceIds = InputDevice.getDeviceIds();        for (int id : deviceIds) {            if (InputDevice.getDevice(id).getName().equals(deviceName)) {                return true;            }        }        return false;    }

4.构建扫描枪解析类ScanGunKeyEventHelper

使用扫描枪解析类需要在相关类中调用 analysisKeyEvent(KeyEvent event) ,传入监听事件,当解析相对应事件获得输入内容,通过OnScanSuccessListener 接口回调返回

/** * 扫码枪事件解析类 by chen */public class ScanGunKeyEventHelper {    private final static long MESSAGE_DELAY = 500;//延迟500ms,判断扫码是否完成。    private StringBuffer mStringBufferResult;//扫码内容    private boolean mCaps;//大小写区分    private final Handler mHandler;    private final BluetoothAdapter mBluetoothAdapter;    private final Runnable mScanningFishedRunnable;    private OnScanSuccessListener mOnScanSuccessListener;    private String mDeviceName;    public ScanGunKeyEventHelper(OnScanSuccessListener onScanSuccessListener) {        mOnScanSuccessListener = onScanSuccessListener ;        //获取系统蓝牙适配器管理类        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//        BluetoothDevice printerdevice = mBluetoothAdapter.getRemoteDevice("ssss");//        BluetoothSocket btSocket = printerdevice.createRfcommSocketToServiceRecord("ssss");        mStringBufferResult = new StringBuffer();        mHandler = new Handler();        mScanningFishedRunnable = new Runnable() {            @Override            public void run() {                performScanSuccess();            }        };    }    /**     * 返回扫码成功后的结果     */    private void performScanSuccess() {        String barcode = mStringBufferResult.toString();        if (mOnScanSuccessListener != null)            mOnScanSuccessListener.onScanSuccess(barcode);        mStringBufferResult.setLength(0);    }    /**     * 扫码枪事件解析     * @param event     */    public void analysisKeyEvent(KeyEvent event) {        int keyCode = event.getKeyCode();        //字母大小写判断        checkLetterStatus(event);        if (event.getAction() == KeyEvent.ACTION_DOWN) {            char aChar = getInputCode(event);;            if (aChar != 0) {                mStringBufferResult.append(aChar);            }            if (keyCode == KeyEvent.KEYCODE_ENTER) {                //若为回车键,直接返回                mHandler.removeCallbacks(mScanningFishedRunnable);                mHandler.post(mScanningFishedRunnable);            } else {                //延迟post,若500ms内,有其他事件                mHandler.removeCallbacks(mScanningFishedRunnable);                mHandler.postDelayed(mScanningFishedRunnable, MESSAGE_DELAY);            }        }    }    //检查shift键    private void checkLetterStatus(KeyEvent event) {        int keyCode = event.getKeyCode();        if (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT || keyCode == KeyEvent.KEYCODE_SHIFT_LEFT) {            if (event.getAction() == KeyEvent.ACTION_DOWN) {                //按着shift键,表示大写                mCaps = true;            } else {                //松开shift键,表示小写                mCaps = false;            }        }    }    //获取扫描内容    private char getInputCode(KeyEvent event) {        int keyCode = event.getKeyCode();        char aChar;        if (keyCode >= KeyEvent.KEYCODE_A && keyCode <= KeyEvent.KEYCODE_Z) {            //字母            aChar = (char) ((mCaps ? 'A' : 'a') + keyCode - KeyEvent.KEYCODE_A);        } else if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {            //数字            aChar = (char) ('0' + keyCode - KeyEvent.KEYCODE_0);        } else {            //其他符号            switch (keyCode) {                case KeyEvent.KEYCODE_PERIOD:                    aChar = '.';                    break;                case KeyEvent.KEYCODE_MINUS:                    aChar = mCaps ? '_' : '-';                    break;                case KeyEvent.KEYCODE_SLASH:                    aChar = '/';                    break;                case KeyEvent.KEYCODE_BACKSLASH:                    aChar = mCaps ? '|' : '\\';                    break;                default:                    aChar = 0;                    break;            }        }        return aChar;    }    public interface OnScanSuccessListener {        void onScanSuccess(String barcode);    }    public void onDestroy() {        mHandler.removeCallbacks(mScanningFishedRunnable);        mOnScanSuccessListener = null;    }    //部分手机如三星,无法使用该方法//    private void hasScanGun() {//        Configuration cfg = getResources().getConfiguration();//        return cfg.keyboard != Configuration.KEYBOARD_NOKEYS;//    }    /**     * 扫描枪是否连接     * @return     */    public boolean hasScanGun() {        if (mBluetoothAdapter == null) {            return false;        }        Set blueDevices = mBluetoothAdapter.getBondedDevices();        if (blueDevices == null || blueDevices.size() <= 0) {            return false;        }        for (Iterator iterator = blueDevices.iterator(); iterator.hasNext(); ) {            BluetoothDevice bluetoothDevice = iterator.next();            if (bluetoothDevice.getBluetoothClass().getMajorDeviceClass() == BluetoothClass.Device.Major.PERIPHERAL) {                mDeviceName = bluetoothDevice.getName();                return isInputDeviceExist(mDeviceName);            }        }        return false;    }    /**     * 输入设备是否存在     * @param deviceName     * @return     */    private boolean isInputDeviceExist(String deviceName) {        int[] deviceIds = InputDevice.getDeviceIds();        for (int id : deviceIds) {            if (InputDevice.getDevice(id).getName().equals(deviceName)) {                return true;            }        }        return false;    }    /**     * 是否为扫码枪事件(部分机型KeyEvent获取的名字错误)     * @param event     * @return     */    @Deprecated    public boolean isScanGunEvent(KeyEvent event) {        return event.getDevice().getName().equals(mDeviceName);}    /**     * 检测蓝牙是否开启     */    public int checkBluetoothValid() {        if(mBluetoothAdapter == null) {//你的设备不具备蓝牙功能!            return 1;        }        if(!mBluetoothAdapter.isEnabled()) {//蓝牙设备未打开,请开启此功能后重试!            return 2;        }        return 3;//蓝牙正常工作    }}

5.在Activity中使用解析类ScanGunKeyEventHelper

Activity中重写dispatchKeyEvent方法,截取Key事件。

  /**     * 截获按键事件.发给ScanGunKeyEventHelper     *     * @param event     * @return     */    @Override    public boolean dispatchKeyEvent(KeyEvent event) {        if (mScanGunKeyEventHelper.isScanGunEvent(event)) {            mScanGunKeyEventHelper.analysisKeyEvent(event);            return true;        }        return super.dispatchKeyEvent(event);    }

获取扫描结果回调,详细代码请查看TestScanner

/** * @author Wu JianCheng * @date on   2018/12/18 14:44 * 测试蓝牙连接扫描枪功能 */public class BleAct extends Activity implements ScanGunKeyEventHelper.OnScanSuccessListener {    ...        /**     * 扫描结果回调     * @param barcode     */    @Override    public void onScanSuccess(String barcode) {        showToast(barcode);    }        ...}

更多相关文章

  1. 【转】Android之自定义设备管理
  2. Android(安卓)BLE程序在Android(安卓)10手机搜不到设备问题分析
  3. Android与单片机的信息传输方案
  4. Android中三种主要的XML解析方法
  5. Android(安卓)Architecture Components 之 LiveData
  6. Android(安卓)小项目之--Mini音乐播放器【简单版】(附源码)
  7. Android上成功实现了蓝牙的一些Profile
  8. 如何搭建简易蓝牙定位系统
  9. 将 apk无线安装到 android 设备中的四种方式

随机推荐

  1. android添加开机声音
  2. Android中的设计模式--建造者模式
  3. Android 打开系统蓝牙设置
  4. android项目源码异步加载远程图片的小例
  5. android 发送短信,彩信,邮件代码
  6. Android自定义属性,format详解
  7. android整合--屏幕旋转触发事件
  8. Android file.createNewFile方法问题总结
  9. 添加了android:configChanges="orientati
  10. Android拍照得到的照片旋转了90度