Android设备获取扫码枪扫描内容
条形码扫码枪现在随处可见,可以很迅速地扫描出条形码内容,比什么手机相机扫码快了不是一点两点。
为了节约成本,扫码枪可以直接通过蓝牙连接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设备获取扫码枪扫描内容相关推荐
- Android设备获取USB扫码枪扫描的内容与可能遇到的问题解决
这篇文章主要给大家介绍了关于Android设备获取扫码枪扫描内容的方法,以及在开发中可能会遇到的问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们 ...
- Android 设备蓝牙连接扫描枪获取扫描内容
Android 设备蓝牙连接扫描枪获取扫描内容 标签(空格分隔): 未分类 条形扫描枪主要可以扫描条形码和二维码等,扫描速度比手机扫描设备快得多,本文简单介绍android 通过蓝牙监听蓝牙连接,当扫 ...
- android设备连接蓝牙扫描枪获取数据
第一步,开启连接 首先要开启蓝牙并且找到蓝牙扫描枪连接,在自己的应用中添加权限 <uses-permission android:name="android.permission.BL ...
- Android扫码枪无输入框获取扫码内容(或者Android自助机获取扫码内容)
公司项目要求获取Android自助机获取扫码内容传给服务器后台,网上查了下和Android扫码枪获取内容一样,不需要添加任何三方sdk,Android原生即可实现.要看到扫码内容,可以在Activit ...
- js 条码枪扫描_使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
下面通过实例代码给大家介绍js扫码枪扫描条形码的实现方法,具体代码如下所示: var keycode = ""; var lastTime=null,nextTime; var l ...
- ddms java 截图_从Android设备获取实时截屏
从Android设备获取实时截屏(adb) 前两篇文章已经把如何控制android设备的输入讲了,这一篇就是如何获取输出,通过adb的方式 原理 framebuffer获取流程 AdbClient和A ...
- php获取扫码枪的内容,一起看看js获取扫码枪输入数据的方法_WEB前端开发
代码详解Vue中key的作用示例_WEB前端开发 key的特殊attribute主要用在Vue的虚拟DOM算法,在新旧Nodes对比时辨识VNodes,这篇文章主要给大家介绍Vue中key的作用,感兴 ...
- js前端获取扫码枪扫描的数据,打印条形码,批量打印
扫码枪相当于键盘输入设备,输入一连串数字后加一个enter键. 但在实际开发中需要区分是扫描枪输入还是键盘用户输入,区别在于扫码枪输入很快 1.获取扫码枪扫码的数据 // 监听扫码window.doc ...
- 关于多卡Android设备获取手机号的研究
首先我们都知道如何获取Android手机的Sim手机号 fun getNativePhoneNumber(context: Context): String? {val tm = context.ge ...
最新文章
- UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
- Spring Cloud构建微服务架构:服务消费(基础)【Dalston版】
- HDU [P3605] Escape
- 搞定Linux Shell文本处理工具,看完这篇集锦就够了(转)
- Joomla css类后缀
- vue.js+koa2项目实战(四)搭建koa2服务端
- AAA 及 RADIUS/HWTACACS 协议配置
- ssl 2133 腾讯大战360#spfa#
- 玉米社:网站打开慢,如何提升网站打开速度?
- latex编译报错:Font ntx-Regular- tlf-ot1r at 438 not found
- 我所热爱的多触摸系统 bill buxton
- 恒压板框过滤实验数据处理_内江靠谱压滤机板框-清源环保
- 国产示波器采用的ADC芯片
- c++手机编程软件_今天小编推荐几款好用的手机编程APP!
- FineReport的数据决策系统注册
- 计算机网络的有线接入,电脑怎么连接有线网络
- 互联网数据中心——IDC(Internet Data Center)
- 浅谈集合List,Set以及Map集合的特点及区别
- Java实现自动发聊天消息
- 如何进行软件评审工作