条形码扫码枪现在随处可见,可以很迅速地扫描出条形码内容,比什么手机相机扫码快了不是一点两点。
为了节约成本,扫码枪可以直接通过蓝牙连接android或其他设备。
那么android设备如何通过蓝牙获取扫描内容的呢?


1. 蓝牙配对,连接设备

打开系统设置,找到蓝牙,打开扫码枪,配对扫码枪设备。输入一个固定的配对码,一般扫码枪说明书里都有写。配对完成后,显示设备已连接。就ok。

2.AndroidManifest中配置权限

android项目中的AndroidManifest.xml文件添加蓝牙权限。

    <uses-permission     android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

3.检测扫码枪的连接状态

通常来说,扫码枪设备也相当于普通外接输入设备类型,外接键盘。

我这款扫码枪设备返回的是如下蓝牙类型。

BluetoothClass.Device.Major.PERIPHERAL

一般而言,通过如下这种方式就可以获得到我们扫码枪设备的信息。

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) {//TODO 获取扫码枪设备信息}}

开发过程中,必然会需要实时判断设备是否正常连接。

mBluetoothAdapter.getBondedDevices()

这个方法仅仅只能够判断设备是否已配对绑定。但是绑定不代表连接,所以只能放弃。

public List getConnectedDevices (int profile)
public int getConnectionState (BluetoothDevice device, int profile)

接着又尝试了这两个方法,方法是可用,但是必须要求设备sdk>18,即android 4.3版本以上才可用。

后来转头一想,既然扫码枪也是输入设备,我们可以不同蓝牙设备状态检测入手,改为从输入设备检测入手。于是,

private void hasScanGun() {Configuration cfg = getResources().getConfiguration();return cfg.keyboard != Configuration.KEYBOARD_NOKEYS;
}

搞定。

4.获取扫码枪扫描内容

扫描枪,既然是一个外接输入设备,那么很自然的,我们就从KeyEvent入手。

事件解析类

/*** 扫码枪事件解析类*/
public class ScanGunKeyEventHelper {//延迟500ms,判断扫码是否完成。private final static long MESSAGE_DELAY = 500;//扫码内容private StringBuffer mStringBufferResult = new StringBuffer();//大小写区分private boolean mCaps;private OnScanSuccessListener mOnScanSuccessListener;private Handler mHandler = new Handler();private final Runnable mScanningFishedRunnable = new Runnable() {@Overridepublic void run() {performScanSuccess();}};//返回扫描结果private void performScanSuccess() {String barcode = mStringBufferResult.toString();if (mOnScanSuccessListener != null)mOnScanSuccessListener.onScanSuccess(barcode);mStringBufferResult.setLength(0);}//key事件处理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 {public void onScanSuccess(String barcode);}public void setOnBarCodeCatchListener(OnScanSuccessListener onScanSuccessListener) {mOnScanSuccessListener = onScanSuccessListener;}public void onDestroy() {mHandler.removeCallbacks(mScanningFishedRunnable);mOnScanSuccessListener = null;}}

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

 /*** Activity截获按键事件.发给ScanGunKeyEventHelper** @param event* @return*/@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {if (isScanGunEvent(event)) {mScanGunKeyEventHelper.analysisKeyEvent(event);return true;}return super.dispatchKeyEvent(event);}/*** 显示扫描内容* @param barcode 条形码*/@Overridepublic void onScanSuccess(String barcode) {//TODO 显示扫描内容}

详细代码参看:https://github.com/czhzero/scangon

注意点:

1.部分机型无法判断外接键盘信息,如三星。

private void hasScanGun() {Configuration cfg = getResources().getConfiguration();return cfg.keyboard != Configuration.KEYBOARD_NOKEYS;
}

三星手机cfg.keyboard返回值等于Configuration.KEYBOARD_NOKEYS。

因此为了更好的兼容,可以采用如下方法,

/*** 判断是否已经连接扫码枪* @return*/
protected boolean hasScanGun() {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) {return isInputDeviceUsed(bluetoothDevice.getName());}}return false;}private boolean isInputDeviceUsed(String deviceName) {int[] deviceIds = InputDevice.getDeviceIds();for (int id : deviceIds) {if (InputDevice.getDevice(id).getName().equals(deviceName)) {return true;}}return false;}

Android设备获取扫码枪扫描内容相关推荐

  1. Android设备获取USB扫码枪扫描的内容与可能遇到的问题解决

    这篇文章主要给大家介绍了关于Android设备获取扫码枪扫描内容的方法,以及在开发中可能会遇到的问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们 ...

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

    Android 设备蓝牙连接扫描枪获取扫描内容 标签(空格分隔): 未分类 条形扫描枪主要可以扫描条形码和二维码等,扫描速度比手机扫描设备快得多,本文简单介绍android 通过蓝牙监听蓝牙连接,当扫 ...

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

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

  4. Android扫码枪无输入框获取扫码内容(或者Android自助机获取扫码内容)

    公司项目要求获取Android自助机获取扫码内容传给服务器后台,网上查了下和Android扫码枪获取内容一样,不需要添加任何三方sdk,Android原生即可实现.要看到扫码内容,可以在Activit ...

  5. js 条码枪扫描_使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解

    下面通过实例代码给大家介绍js扫码枪扫描条形码的实现方法,具体代码如下所示: var keycode = ""; var lastTime=null,nextTime; var l ...

  6. ddms java 截图_从Android设备获取实时截屏

    从Android设备获取实时截屏(adb) 前两篇文章已经把如何控制android设备的输入讲了,这一篇就是如何获取输出,通过adb的方式 原理 framebuffer获取流程 AdbClient和A ...

  7. php获取扫码枪的内容,一起看看js获取扫码枪输入数据的方法_WEB前端开发

    代码详解Vue中key的作用示例_WEB前端开发 key的特殊attribute主要用在Vue的虚拟DOM算法,在新旧Nodes对比时辨识VNodes,这篇文章主要给大家介绍Vue中key的作用,感兴 ...

  8. js前端获取扫码枪扫描的数据,打印条形码,批量打印

    扫码枪相当于键盘输入设备,输入一连串数字后加一个enter键. 但在实际开发中需要区分是扫描枪输入还是键盘用户输入,区别在于扫码枪输入很快 1.获取扫码枪扫码的数据 // 监听扫码window.doc ...

  9. 关于多卡Android设备获取手机号的研究

    首先我们都知道如何获取Android手机的Sim手机号 fun getNativePhoneNumber(context: Context): String? {val tm = context.ge ...

最新文章

  1. UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
  2. Spring Cloud构建微服务架构:服务消费(基础)【Dalston版】
  3. HDU [P3605] Escape
  4. 搞定Linux Shell文本处理工具,看完这篇集锦就够了(转)
  5. Joomla css类后缀
  6. vue.js+koa2项目实战(四)搭建koa2服务端
  7. AAA 及 RADIUS/HWTACACS 协议配置
  8. ssl 2133 腾讯大战360#spfa#
  9. 玉米社:网站打开慢,如何提升网站打开速度?
  10. latex编译报错:Font ntx-Regular- tlf-ot1r at 438 not found
  11. 我所热爱的多触摸系统 bill buxton
  12. 恒压板框过滤实验数据处理_内江靠谱压滤机板框-清源环保
  13. 国产示波器采用的ADC芯片
  14. c++手机编程软件_今天小编推荐几款好用的手机编程APP!
  15. FineReport的数据决策系统注册
  16. 计算机网络的有线接入,电脑怎么连接有线网络
  17. 互联网数据中心——IDC(Internet Data Center)
  18. 浅谈集合List,Set以及Map集合的特点及区别
  19. Java实现自动发聊天消息
  20. 如何进行软件评审工作

热门文章

  1. 在Html显示拼音的方法
  2. 中国 Android 统一推送联盟新进展:一批 App 已准备好
  3. 远程桌面的登录,锁定与解锁
  4. python import自己写的.py文件
  5. MES助中石化实现精益化生产(MES应用案例)
  6. YOUChain 首席架构师 何畅彬:YOUChain技术白皮书首次亮相,首席架构师深度解读
  7. 用java实现五子棋三手交换_什么是五子棋三手交换五手两打
  8. 【图像配准】基于粒子群改进sift实现SAR图像配准附matlab代码
  9. 如何看自己电脑得好坏
  10. Hrm-人力资源系统开发笔记03