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

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


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


1.蓝牙配对

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

2.AndroidManifest中配置权限

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

<!-- 蓝牙 --><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

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

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

   /*** 扫描枪是否连接* @return*/public boolean hasScanGun() {if (mBluetoothAdapter == null) {return false;}Set<BluetoothDevice> blueDevices = mBluetoothAdapter.getBondedDevices();if (blueDevices == null || blueDevices.size() <= 0) {return false;}for (Iterator<BluetoothDevice> 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() {@Overridepublic 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<BluetoothDevice> blueDevices = mBluetoothAdapter.getBondedDevices();if (blueDevices == null || blueDevices.size() <= 0) {return false;}for (Iterator<BluetoothDevice> 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*/@Deprecatedpublic 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*/@Overridepublic 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*/@Overridepublic void onScanSuccess(String barcode) {showToast(barcode);}...}

Android 设备蓝牙连接扫描枪获取扫描内容相关推荐

  1. android获取wifi连接状态,获取android设备wifi连接状态

    本文将介绍如何获取android设备wifi连接状态! 添加访问权限(AndroidManifest.xml文件里) Java代码(MainActivity.java文件) package com.e ...

  2. Android手机HC-05蓝牙连接Arduino nano获取DHT-11温湿度传感器数据

    如果您觉得本文对您有用,希望您点赞,收藏并且把它分享出去,不明白的可以在评论区留言,我会一一解答,感谢您的支持!! 目标 Android手机HC-05蓝牙连接Arduino nano获取DHT-11温 ...

  3. uniapp 扫描枪获取条码不全解决办法,vue组件,使用双向绑定,回车事件触发,获取文本不全问题

    原因分析: uniapp使用vue,双向绑定组件,在input标签loop事件循环获取文本的过程中,读取文本信息不是顺序读取,如果条码中包含了回车键,比如扫描枪,扫描文本后会追加回车键,监控文本读取还 ...

  4. 实现原理 扫描枪_扫描枪原理 - 企业信息化的利器---条形码 - 小组 - 博客园

    丰富的生活随着彩色打印机的介入,老百姓的家庭变得更加多彩.近年来计算机技术的飞速发展,有些家庭有了更多的需求--扫描枪.它更是为家庭娱乐提供了新的融洽亲情的方式.在选择使用扫描枪前,先认识一下扫描枪. ...

  5. android进入wifi权限,判断android设备wifi连接状态,判断android设备wifi,添加访问权限(Andro...

    判断android设备wifi连接状态,判断android设备wifi,添加访问权限(Andro 添加访问权限(AndroidManifest.xml文件里) ```Java代码(MainActivi ...

  6. android设备连接蓝牙扫描枪获取数据

    第一步,开启连接 首先要开启蓝牙并且找到蓝牙扫描枪连接,在自己的应用中添加权限 <uses-permission android:name="android.permission.BL ...

  7. Android BLE蓝牙4.0开发 实现扫描、连接、通讯、获取通知、特性等 (一、打开蓝牙 进行扫描)

    目录 首先说下蓝牙4.0 目前android蓝牙有2种: ble蓝牙开发流程: 1.首先当然是进行权限申请啦: 2.获取蓝牙适配器 BluetoothAdapter 3.打开蓝牙 4.关闭蓝牙 5.在 ...

  8. android mac蓝牙连接不上,Mac蓝牙找不到设备解决方法介绍

    很多新手用户不知道怎么在mac系统中连接蓝牙设备,其实方法还是很简单的,当然如果你想要进一步进行了解的话倒是可以跟随小编一起加入这款Mac蓝牙找不到设备解决方法介绍的文章中仔细了解衣服哦,希望小编为你 ...

  9. 【Android】蓝牙连接使用

    本文实现蓝牙连接,使用的GitHub开源库实现,调用封装好的API. 1.依赖 implementation 'com.vise.xiaoyaoyou:baseble:2.0.6' 2.权限申请 // ...

最新文章

  1. 图像投影特征图的波峰波谷查找的相关原理及利用差分遍历法查找波峰的OpenCV代码
  2. AB1601的AD转换注意事项
  3. 求凸包(两遍扫描,求上下凸包的方法)
  4. android 导航 美国,变美了 Android N或用全新虚拟导航按键
  5. 苹果系统安装python环境_如何在mac下配置python虚拟环境
  6. 归并排序--Java
  7. java怎么安装_Java桌面应用程序篇:发展历史以及程序的应用
  8. Excel条件格式化(conditional formatting)应用
  9. Servlet Cookie 处理
  10. java random api_API中的Scanner、Random、ArrayList、String类
  11. 建立域用户时遇到的问题。
  12. UltraEdit v17.10.0,注册机,注册码
  13. VS 2010 安装 .net framework2.0/3.0/3.5
  14. word2007里插入分节符
  15. Ubuntu的版本号命名规则
  16. 1-初识C语言-C语言学习笔记来自比特鹏哥的资料
  17. 树莓派使用pip安装cython
  18. Jenkins配置Coding Webhook
  19. 谷歌地图 官网 详细API
  20. 计算机组成原理学习笔记(上)

热门文章

  1. Android手机FOTA升级的大概流程介绍
  2. android蓝牙无法输入密码,由于加密问题,Android蓝牙文件无法写入描述符
  3. 物联网技术与应用【第五章测验答案】
  4. 模糊照片修复软件有什么?这些软件大家都在用
  5. GAMS中导入Excel数据
  6. python中变量替换_如何在python类中替换变量?
  7. java解析xlsb文件_读取XLSB文件Apache POI的异常java.io.CharConversionException
  8. Modemcu上传 mysql_nodemcu 连接domoticz上传自定义的传感器采集交流电压
  9. Linux——Kali更新源(常用镜像源已列出)
  10. 车联网安全学习之TBOX