Android使用AccessibilityService实现USB扫码枪数据抓取

android单屏机,通过扫码枪扫描二维码的场景非常多,扫码枪的种类也有蓝牙、USB、串口等等

目前USB的扫码枪主流的就是以下两种

1、USB HID-KBW:扫码器会将扫描出来的内容转化为键盘事件,就是Android中KeyEvent里面对应的常量(KeyEvent.KEYCODE_*)。

2、USB虚拟串口:可使用连接到UsbDevice进行通信,读取数据。(设备要支持串口)

支持Android热插拔USB扫描枪会在有EditText时,扫描枪扫描内容自动输入到编辑框了,但是有很多输入法兼容的问题,比如搜狗输入法识别到HID设备时会隐藏无法弹出,如果输入法切换成中文时会输入中文等等。

通过串口的方式直接获取原始数据,不再跟输入法产生冲突,可惜设备是USB HID的,通过大量的尝试(包括USB虚拟串口)都不支持(对串口不了解的同学可以先看看这篇文章)

扫码枪是基于键盘输入的,尝试从获取焦点的Activity中的dispatchKeyEvent(KeyEvent event)进行拦截,可惜只能解决掉中文的问题,事件还是先走到输入法才能回到Activity。于是强大的AccessibilityService就上场了,使用AccessibilityService可以优先获取到键盘事件。

使用强大的AccessibilityService(Google为了让Android系统更实用,为用户提供了无障碍辅助服务),但需要到系统设置->无障碍->服务开启当前服务。对AccessibilityService不了解的同学看看

废话不多说看实现步骤

1、先创建扫码Service直接继承AccessibilityService就OK

public class ScanService extends AccessibilityService{

private staticOnKeyEvent onKeyEvent;

@Override

public int onStartCommand(Intent intent,intflags,intstartId) {

returnSTART_STICKY;

}

@Override

public void onAccessibilityEvent(AccessibilityEvent event) {

}

@Override

public void onInterrupt() {

}

@Override

protected boolean onKeyEvent(KeyEvent event) {

if(onKeyEvent!=null){

//这里通过回调的方式将事件传出去统一处理

//返回true事件就会拦截不会继续传递

returnonKeyEvent.onKeyEvent(event);

}

return super.onKeyEvent(event);

}

/**

*设置监听

*@paramonKeyEvent

*/

public static void setOnKeyEvent(OnKeyEvent onKeyEvent){

ScanService.onKeyEvent=onKeyEvent;

}

public interface OnKeyEvent{

boolean onKeyEvent(KeyEvent event);

}

}

2、创建好自己的ScanService后需要在manifest中进行注册

android:name="包名.service.ScanService"

android:enabled="true"

android:exported="true"

android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">

android:name="android.accessibilityservice"

android:resource="@xml/accessibility"

/>

创建android:resource需要用到的xml,在res下新建xml文件夹,新建accessibility.xml

android:accessibilityEventTypes="typeAllMask"

android:accessibilityFeedbackType="feedbackGeneric"

android:accessibilityFlags="flagRequestFilterKeyEvents"

android:canRetrieveWindowContent="true"

android:notificationTimeout="100"

android:canRequestFilterKeyEvents="true"

android:description="@string/accessibility_description"

android:packageNames="包名"/>

android:description指定一个String作为描述文案

这里是描述辅助功能的文案

到此为止AccessibilityService就配置好了,你的应用就会出现在系统设置->辅助功能列表里,只需要手动在设置中打开辅助功能,扫码枪的键盘事件就会触发ScanService的onKeyEvent

接下来是对事件的处理1、过滤非扫码枪的设备

/**

*检测输入设备是否是扫码器

*

*@paramcontext

*@return 是的话返回true,否则返回false

*/

public boolean isInputFromScanner(Context context, KeyEvent event) {

if(event.getDevice() ==null) {

return false;

}

//        event.getDevice().getControllerNumber();

if(event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) {

//实体按键,若按键为返回、音量加减、返回false

return false;

}

if(event.getDevice().getSources() == (InputDevice.SOURCE_KEYBOARD | InputDevice.SOURCE_DPAD | InputDevice.SOURCE_CLASS_BUTTON)) {

//虚拟按键返回false

return false;

}

Configuration cfg = context.getResources().getConfiguration();

returncfg.keyboard != Configuration.KEYBOARD_UNDEFINED;

}

2、处理事件

Runnable mScanningFishedRunnable =newRunnable() {

@Override

public void run() {

String code = mStringBufferResult.toString();

//做相应处理....

mStringBufferResult.setLength(0);

}

};

/**

*扫码枪事件解析

*

*@paramevent

*/

public void analysisKeyEvent(KeyEvent event) {

intkeyCode = event.getKeyCode();

python读取usb扫码枪数据_USB相关推荐

  1. python读取usb扫码枪数据_PyUsb USB条码扫描

    我在用Ubuntu的霍尼韦尔USB 3310g扫描仪从条形码或qrcode输出一个字符串.我有libusb和一个名为metro-usb(http://gitorious.org/other/metro ...

  2. python读取usb扫码枪数据_vue扫码枪input接收数据

    1.使用场景 vue 项目, 需要用扫码枪完成获取二维码中内容并进行处理的功能, 扫码枪就是普通那种,先找到一个有焦点的input,然后扫码枪工作,将扫描到的信息录入到input中,必须要有焦点. 打 ...

  3. python读取usb扫码枪_使用jQuery监听扫码枪输入并禁止手动输入的实现方法

    基于jQuery的扫码枪监听.如果只是想实现监听获取条码扫码信息,可以直接拿来使用,如果有更多的条码判断处理逻辑需要自己扩展. 一.功能需求 使用扫码枪扫描条码,在一个web页面监听获取扫码枪的数据, ...

  4. python读取excel表格数据

    python操作excel主要用到xlrd和xlwt两个库,xlrd读取表格数据,支持xlsx和xls格式的excel表格:xlwt写入excel表格数据 一.python读取excel表格数据 1. ...

  5. python读取20万数据Excel文件+拆分数据

    python读取20万数据Excel文件 使用普通的pandas读取Excel,再结合xlrd读取,可能会读取的Excel数据会不全,最多只能读取到65535+行的数,如果读取超大excel数据时就读 ...

  6. python读取nc文件数据生成专业气象图

    python读取nc文件数据生成专业气象图如色斑图.等值线.风向标,如下图所示: 代码如下: # -*- coding: utf-8 -*- """ Created on ...

  7. Python读取夜间灯光数据看中国城市发展

    本文转载自气象学渣,详情可以扫描下方二维码: 在城市化(城镇扩展).环境和能源等社会科学研究中常使用夜间灯光影像作为人类活动的表征.研究中使用最多的夜间灯光数据来自美国国防气象卫星计划(Defense ...

  8. ROS下Python读取ft_300传感器数据

    ROS下Python读取ft_300传感器数据 硬件条件: ur3 ft_300 ros:melodic #!/usr/bin/env python2 import rospy from geomet ...

  9. python读取txt文件并求和,Python读取txt文件数据的方法(用于接口自动化参数化数据)...

    小试牛刀: 1.需要python如何读取文件 2.需要python操作list 3.需要使用split()对字符串进行分割 代码运行截图 : 代码(copy) #encoding=utf-8 #1.r ...

最新文章

  1. Windows/Linux TCP Socket网络编程简介及测试代码
  2. Android之图片加载框架Picasso源码解析
  3. 【WPF】如何使用wpf实现屏幕最前端的绘图?
  4. drf1 rest restful规范
  5. Abp Uow 设计
  6. 我的工作网怎么样_分享一下我在珍爱网的相亲经历
  7. pandas DataFrame数据筛选和切片
  8. 人车物跟踪在另外的机器上跑不起来
  9. leetcode力扣347. 前 K 个高频元素
  10. 模板元实现顺序、分支和循环结构
  11. 2017计算机基础知识ppt,2017计算机基础试卷.doc
  12. 如何给Mac电脑的磁盘进行分区?
  13. windows.old的删除方法
  14. python最终目标_Python晋级之路-工欲善其事必先利其器
  15. 使用Python自动遍历并删除扫描PDF中的空白页
  16. uni-app生成app的兼容性调研报告
  17. java timeunit_java并发之TimeUnit
  18. 【推荐系统】今日头条推荐算法原理全文详解
  19. 怎样在matlab q-q图上读出斜率,Matlab的常见问题
  20. 分布式定时任务(XXL_JOB)

热门文章

  1. 一些能提高ABAP开发人员日常工作效率的ABAP小工具
  2. 如何通过Restful API的方式读取SAP Commerce Cloud的Product Reference
  3. sap.ui.layout.form.SimpleForm.prototype
  4. UI5 metadata usage in the runtime
  5. SAP CRM WebClient UI incident - how is sales area saved
  6. how to debug connector indexing
  7. 如何更换outlook邮件的背景色
  8. Chrome开发者工具关于网络请求的一个隐藏技能 1
  9. html点击按钮执行php代码,php代码在html文件里面执行的示例
  10. mysql dump gtid_mysqldump GTID搭建主从复制库