安卓键盘输入识别

android和web扫描枪开发 扫描枪程序开发 usb扫描枪工作方式:就像键盘输入一样,扫描枪是输入条码数数据+回车键。 懂了工作方式就容易了, 开发过程。 1.text控件自动焦点。 2.得到条码数数据。 3.清空text控件的数据 web 版本扫描枪,用js 来进行识别回车事件之后清空文本;`代码如下: 扫描枪开发<script type="text/javascript"></s 阅读详情
AI摘要

本文详细描述了如何在安卓系统中识别并处理外部键盘输入,通过重写EditText接口并打印KeyEvent信息,区分物理按键输入和RFID刷卡输入。文章还介绍了如何根据输入设备类型处理不同事件,避免不必要的文本显示。

一、     文档概述

本文档主要描述如何对安卓系统中外部键盘输入进行识别,根据输入设备的不同采取不同的操作。

二、     原理说明

系统使用的是CubieBoard2开发板(即树莓派3),运行安卓4.2操作系统。其硬件的结构如下:








按照门禁系统的业务流程,正常情况下通过物理按键输入房号进行呼叫或者开门密码,同时也可以通过刷ID或IC卡直接开门。

在使用LINUX或其他较为底层的嵌入式系统中,根据接口的不同,可以轻易的识别外部输入设备,从而进行业务判断。而本应用场景基于安卓系统,由于良好的封装性,底层输入对于上层应用来说,都是键盘输入,并没有明显的区分输入究竟是物理按键还是RFID读卡器。

不过,在对于安卓系统的一定了解之后,发现底层输入最终通过事件发送给安卓系统,安卓系统对获取到的事件进行处理。然后发现EditText中有这样的一个接口:

public boolean onKey(View v, int keyCode, KeyEvent event);

于是,这里猜想,根据KeyEvent的信息应该可以识别不同的输入设备。

于是重写该接口,将每次获取到的事件都打印出来:

editText = (EditText) findViewById(R.id.et_main_num);
editText.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
	Log.v("KEYEVENT",event.getDevice().toString());
	return false;//返回false表示事件能够被后续的服务所获取;返回true表示该按键输入事件不再分发给后续服务。
	}
});

然后分别进行按键输入和RFID刷卡输入,可看到如下信息:

物理按键输入:
V/KeyEvent(8551): Input Device 8: RFID Reader With Keyboard USB RFID Reader
V/KeyEvent(8551):   Descriptor: b7e9cbd07a552feaf97d1ae331d71a89ea1007c9
V/KeyEvent(8551):   Generation: 28
V/KeyEvent(8551):   Location: external
V/KeyEvent(8551):   Keyboard Type: alphabetic
V/KeyEvent(8551):   Has Vibrator: false
V/KeyEvent(8551):   Sources: 0x101 ( keyboard )
RFID刷卡输入:
V/KeyEvent(8551): Input Device 6: sw-keyboard
V/KeyEvent(8551):   Descriptor: 485d69228e24f5e46da1598745890b214130dbc4
V/KeyEvent(8551):   Generation: 10
V/KeyEvent(8551):   Location: built-in
V/KeyEvent(8551):   Keyboard Type: non-alphabetic
V/KeyEvent(8551):   Has Vibrator: false
V/KeyEvent(8551):   Sources: 0x101 ( keyboard )

可以看出,KeyEvent中的信息包含了设备的名称,描述符等信息,在处理时可以根据这些信息区分输入设备。其中Sources字段表明无论哪种输入,均被安卓系统识别为键盘输入。

通过这个实验,发现每次按键输入或者刷卡输入时,KeyEvent都会被打印两次,导致这个的原因是因为onKey()会分别在ACTION_DOWN和ACTION_UP时被触发,ACTION_DOWN和ACTION_UP分别对应按键按下和按键松开动作。

这里需要注意的是,在动作为ACTION_UP的KeyEvent事件之后,按键的值才会显示在对应的EditText上。如果在动作为ACTION_DOWN的KeyEvent事件中,获取EditText的文本,只能获取到不包括当前按下的按键的文本,当前的按键值可以通过keyCode获取。

利用这个特性,当不需要将按键值显示到EditText上时,可以只处理ACTION_DOWN的事件,丢弃ACTION_UP的事件。

    可参照如下代码:

cardID=new StringBuffer();
editText = (EditText) findViewById(R.id.et_main_num);
editText.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
String editString = ((EditText) v).getText().toString();
//根据输入设备的不同,进行不同的处理,分为ADC键盘、RFID读卡器和其他设备(如鼠标等)
if(event.getDevice().getName().contains("RFID")){//RFID输入主要读取IC卡的ID
editText.setText("");
if(event.getAction()==KeyEvent.ACTION_DOWN){
		int tmpKeyCode=event.getKeyCode();
		if(tmpKeyCode==KeyEvent.KEYCODE_ENTER){//获取到ENTER字符时,表示ID卡已读取完成。							
Log.v("KEYEVENT","Card ID:"+cardID);
			cardID.setLength(0);							
}else{
//将获取到的KEYCODE添加到字符串,keycode2Char为自定义函数,将KEYCODE转换为char
cardID.append(keycode2Char(tmpKeyCode));
		}
		//直接返回true,后续的系统监听将得不到这个事件,这里将获取到的数字不在EditText上显示。
		return true;
	}else if(event.getAction()==KeyEvent.ACTION_UP){
		//不处理ACTION_UP事件
		return true;
	}					
}else if (event.getDevice().getSources()==257){//257为键盘输入,ADC键盘或者其他键盘输入
//为了使特定的字符不显示在editText上,在收到ACTION_DOWN事件后进行按键处理,
	if(event.getAction()==KeyEvent.ACTION_DOWN){	
		…//按键处理
		return true;
	}else if(event.getAction()==KeyEvent.ACTION_UP){
		//不处理ACTION_UP事件
		return true;
	}						
}
	//除了以上的几种设备之外,其他的设备返回false,避免其他设备无法正常工作
	return false;
}
});

需要注意的是,这里的onKey()接口只会在物理输入时进行触发,包括外接的鼠标键盘。而使用系统自带的虚拟键盘输入时并不会触发。




Android HID设备(键盘、遥控等)功能实现流程及键值映射关系 (Human Interface Device,人机接口设备)是USB设备中常用的,是直接与人交互的USB设备,例如键盘、遥控器、鼠标与游戏杆等。在USB设备中,HID设备的成本较低。之前文章中整理了android中各种功能键值定义,那么从键盘按键到安卓设备控制生效的流程是怎样的呢?EventHub从evdev驱动程序中读取原始事件,并使用键盘的按键布局映射将 Linux 按键代码(有时也称扫描代码)映射到 Android 按键代码中。将消费原始事件,并更新元键状态。 阅读详情

相关推荐

Android语音识别开发指南

在这篇文章中,我们将详细介绍如何在Android应用程序中实现语音识别功能。语音识别是一项强大的技术,允许用户通过语音与应用程序进行交互,而无需键盘输入。现在,你可以运行你的Android应用程序,并点击"开始语音识别"按钮,开始语音识别。识别完成后,你将看到识别到的文本显示在屏幕上。首先,我们需要在Android应用程序中添加语音识别功能的权限。然后,我们需要在应用程序的布局文件中添加一个按钮,用于触发语音识别功能。接下来,我们需要在Activity或Fragment中处理语音识别功能。

git_web425的博客 418

Android 获取USB输入设备信息/区分虚拟键盘和外接键盘输入

Android 获取USB等多个输入设备信息-InputDevice Activity内的onKeyDown函数可以捕获输入设备的输入,但是如果android接了多个usb或者其他接口的输入设备,这时候,怎么获取不同输入设备的信息呢?如果能获取到这个输入设备的信息,我们就可以区分不同的输入设备来响应不同的事件。 所以翻了一KeyEvent这个类,查看了里面的方法,发现有这么一个类InputDe...

lakebobo的博客 8927

Android本地语音转文字神器Transcribro

Transcribro是一款注重隐私的Android本地语音识别键盘,基于whisper.cpp和SileroVAD技术实现完全离线的语音转文字功能。其核心优势包括:本地处理确保数据安全、支持系统级语音识别服务调用、开源透明可验证。安装可通过Accrescent商店或GitHub获取,需在系统设置中启用键盘和语音服务。目前仅支持英语识别,采用轻量模型优化性能,适合隐私敏感场景如医疗、法律等场景使用。未来将扩展多语言支持,用户可通过GitHub参与开发。

qq_29655401的博客 1116

QT捕获键盘输入,并将输入快捷键组合显示出来,并解决在linux环境下部分按键组合(如Ctrl+Shift+字母)不能识别问题

QT捕获键盘输入 生成快捷键 QlineEdit

weixin_61476363的博客 2282

《机器学习》周志华_自学记录

第一章绪论## 1.1引言机器学习所研究的主要内容,是关于在计算机上从数据中产生"模型"(model)的算法,即"学习算法"(learning algorithm).在面对新的情况时(例如看到一个没剖开的西瓜),模型会给我们提供相应的判断(例如好瓜).如果说计算机科学是研究关于"算法"的学问,那么类似的,可以说机器学习是研究关于"学习算法"的学问.## 1.2基本术语:用于预测离散值,例如将样本分为“好瓜”或“坏瓜”。:用于预测连续值,例如西瓜的成熟度(如0.95、0.37)。

2201_75296678的博客 2534

TensorRT-LLM环境配置避坑指南:从安装到实战

本文是一份详尽的TensorRT-LLM环境配置避坑指南。文章重点解析了从Python、CUDA、PyTorch版本选择,到解决mpi4py安装这一核心难题的完整流程,并提供了经过验证的稳定版本组合与实战排错方案,帮助开发者高效部署大语言模型推理优化环境。

a0b1c2d3的专栏 985

Android中外接键盘的检测的实现

Android中外接键盘的检测的实现

Android framework 606

Unity资源逆向解析:从APK到AssetStudio的完整实战

本文详细介绍了Unity资源逆向解析的全流程,从APK解包到使用AssetStudio深度解析Unity游戏资源。通过实战案例演示如何提取《植物大战僵尸》等游戏的素材,包括贴图、音频和3D模型,帮助开发者掌握Unity游戏逆向工程的核心技术。

weixin_30664051的博客 475

Android输入系统梳理

Android最常见的输入设备是触摸屏,然而除了触摸屏,安卓还支持其他输入设备如鼠标、游戏手柄、键盘等。当输入设备可用时,Linux内核会在/dev/input/下创建对应的名为event0~n或其他名称的设备节点。而当输入设备不可用时,则会将对应的节点删除。在用户空间可以通过ioctl的方式从这些设备节点中获取其对应的输入设备的类型、厂商、描述等信息。

qq_36267931的博客 1079

Windows 11下JDK 21与JMeter 5.6.3环境配置全攻略

环境变量是操作系统管理软件路径与执行权限的核心机制,它通过预设的键值对,指引系统在调用命令时定位可执行文件。理解其工作原理,是解决软件安装后“命令未找到”等问题的关键。对于Java生态而言,正确配置JAVA_HOME和Path变量,不仅能让java、javac等基础命令全局可用,更是Maven、Gradle乃至JMeter等众多工具链顺畅运行的基石。JMeter作为一款基于Java开发的经典性能测试与接口测试工具,其稳定运行高度依赖健全的Java环境。本文聚焦于在Windows 11系统上,为JDK 21与

weixin_30940783的博客 451

DIY必备:如何用N-MOS管搭建低成本DC有刷电机驱动电路(附原理图+避坑指南)

本文详细介绍了如何使用N-MOS管搭建低成本、高可靠性的DC有刷电机驱动电路。针对DIY爱好者,从核心原理、电路设计、元件选型到焊接调试,提供了完整的实战指南,并重点解析了续流二极管选型、栅极驱动设计等关键避坑要点,帮助读者成功驱动电机并确保电路稳定运行。

delta的博客 776

讯飞输入法pad版x86_讯飞输入法Pad版

《讯飞输入法Pad版》是讯飞输入法团队祝阿内安卓系统的平板电脑打造的一款输入法软件。各种键盘,无论是九宫格、全键盘还是笔画输入,全部支持。更有业界第一的语音输入,让你告别双手也能输入。软件详情讯飞输入法Pad版是专为Android Pad研发的输入法,不仅支持常规的键盘输入,更有语音输入和连续手写,让Pad输入更方便!思想有多快,输入就有多快!安卓平板输入,就选讯飞输入法Pad版!功能特色1、首创...

weixin_42604188的博客 758

7.7 数据分析助手:用AI洞察业务数据价值

摘要:AI数据分析助手构建指南 本文介绍了如何构建AI数据分析助手,帮助企业从业务数据中提取价值。系统包含四大核心模块:自然语言理解模块解析用户查询意图,查询规划模块转换为SQL语句,数据可视化模块生成图表,以及洞察生成模块提供深度分析。文章通过销售数据分析助手案例,展示了从数据库准备到自然语言处理的完整实现流程,包括示例代码和系统架构图。该解决方案可降低数据分析门槛,让业务人员直接参与数据探索,提升决策效率。

yonggeit的博客 4093

Android键盘映射之三

在系统启动后,android 会通过      static const char *device_path = "/dev/input";     bool EventHub::penPlatformInput(void)     res = scan_dir(device_path);  通过下面的函数打开设备。  int EventHub::pen_device(c

zxy12175968的专栏 665

大数据领域数据服务的数据分析工具推荐

你有没有过这样的经历?——领导说“帮我分析一下上个月的销量”,你打开Excel却发现数据有100万行,电脑直接卡死;或者想实时知道“现在直播间的观众在买什么”,却不知道用什么工具处理每秒10万条的点击数据。本文的目的:帮你解决“选什么工具做什么事”的问题,覆盖大数据服务的全流程(采集→存储→处理→分析→可视化),推荐高频、实用、易上手的工具,并讲清楚它们的“适用场景”和“优缺点”。范围。

大数据洞察的博客 1932

2026年1至9月武汉市房地产价格深度分析报告

本报告基于2026年1月至9月武汉市实际成交案例,从成交价格、区域分布、户型结构、价格走势等维度进行深度分析。数据来源包括武汉市住房保障和房屋管理局备案数据、主要中介机构成交记录及典型楼盘网签案例,覆盖全市15个行政区及主要功能板块。

王国平的博客 332

讯飞输入法pad版x86_讯飞输入法Pad版软件下载_讯飞输入法Pad版app下载_讯飞输入法Pad版安卓下载_亲亲宝贝网...

讯飞输入法Pad版是专为Android Pad研制的输入法,不只支撑常规的键盘输入,更有语音输入和接连手写,让Pad输入更便利!思维有多快,输入就有多快!安卓平板输入,就选讯飞输入法Pad版!【讯飞输入法Pad版功用特点】首创“随意写”输入:叠写连写,为所欲为,准确率超越98%,手写体会更天然!语音辨认率业界*:语音辨认率超越95%,一起支撑普通话、粤语、英语辨认,语音输入更便利!键盘输入功用完全...

weixin_34245171的博客 1128

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ANDROID Porting系列八、Keymaps and Keyboard Input

<br />•功能<br />•关键位置图<br />•关键字符映射<br />•实现您自己的驱动程序(驱动程序模板)<br />•示例实现<br />    本文档介绍了如何获取键盘输入转化为Android actions,以及如何可以自定义键的布局和重点字符映射到自己的设备相匹配的需要。<br />    Android使用Linux操作系统的标准输入设备事件(/ dev/event0)和驱动在linuxlinux/input.h内核头文件描述。欲了解更多有关标准的Linux驱动程序的信息输入,请htt

不以己悲的博客 4489

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【字节跳动大牛系列教学】Android源码剖析之Framwork层消息传递

1、将触摸、键盘输入等消息转化成可识别的信号2、判断按键消息直接发给当前窗口进入View,触摸消息根据坐标匹配窗口3、最终处理消息。1、计算视图大小执行measure方法2、为视图分配位置执行layout方法3、将视图绘入窗口即draw方法。而View所有的功能将围绕这两点展开。就第一点先说说,用户消息类型指Wms将硬件物理消息转化成统一格式消息,分为三类:按键消息、触摸消息和轨迹球消息(此消息API的Demo中可见,游戏中比较常见)。

m0_60721649的博客 757

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android练习之Linkify文字链接

code View Code 1 package com.example.flexe1; 2 3 import android.os.Bundle; 4 import android.app.Activity; 5 import android.text.Editable; 6 import android.text.method.KeyListe...

asdfqwer11111111的博客 191

赛门铁克:Android勒索软件变种出现语音识别方式

近期,赛门铁克安全团队发现,最新Android勒索软件变体Android.Lockdroid.E开始具备语音识别功能。当用户说出正确内容,勒索软件才允许用户‘赎回’自己的手机设备。该恶意软件使用语音识别 API,要求受害者通过语音,而非传统的键盘输入方式提供解锁码。 在感染设备后,Android.Lockdroid.E使用SYSTEM类型窗口锁定设备,随...

weixin_34274029的博客 180

Android勒索软件变种出新花样:具备语音识别功能

根据安全研究机构赛门铁克发布的最新公告显示,Android勒索软件变种出现了语音识别方式,最新Android.Lockdroid.E变体具备语音识别功能,通过使用语音识别来代替文本输入解锁码。 新变种工作机制 该恶意软件使用语音识别API,要求受害者通过语音,而非传统的键盘输入方式提供解锁码。 当设备被感染后,Android.Lockdroid.E使用...

weixin_33973600的博客 197

如何用JavaScript彻底解放你的安卓手机:AutoJs6终极自动化指南

你是否每天都要在手机上重复那些枯燥的操作?定时打卡、消息回复、数据采集……这些重复性工作不仅耗时,还容易出错。现在,让我告诉你一个简单高效的解决方案:**AutoJs6**——这款基于JavaScript的安卓自动化工具,能让你的手机真正智能起来。 AutoJs6是Auto.js的二次开发项目,它通过JavaScript脚本实现了对安卓设备的全面控制。无论你是普通用户想要自动化日常任务,还是开发

gitblog_01144的博客 219

Android 手机模拟游戏手柄(USB,C#,winio)

Android 手机模拟游戏手柄(USB,C#,winio)使用的知识点:Android服务器通过USB连接PC端,winio发送键盘消息,Socket编程,线程,Android多点触控先说下思路,首先在Android端开启服务器程序,然后在PC端开启一个服务器程序模拟发送键盘信息(C#编写)。手机和PC用USB连接,Android和PC的通信通过Socket完成。 PC客户端程序:虽然有很多方法

萌萌的It人 www.itmmd.com 9601

Android中使用代码截图的各种方法总结

 1,基于Android SDK的截屏方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法。网上已经有很多的实例了。首先创建一个android project,然后进行Layout,画一个按键(res/layout/main.xml): xmlversion="1.0"encoding="utf-8"?> Line

LuLu侠的专栏 1710

安卓 Kotlin Jetpack Compose 中如何实现扫码枪监听,全网最简单,最有话语权的技巧

本文介绍了一种基于Jetpack Compose的扫码枪监听实现方案,通过监听键盘事件模拟输入,实现条码扫描功能。整个实现不到100行纯Kotlin代码,无需任何第三方依赖,具有零依赖、纯原生、生产级健壮性等特点。

weixin_55636632的博客 215
上一篇: 【安卓开发】CubieBoard2解决声音默认输出设置
下一篇: 关于const char 和 char 能否相容
Denny#
博客等级 码龄17年 328粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值