android键盘输入读取
android键盘输入读取
监控android键盘输入方式有两种,一种在java层实现,重写onKeyDown和onKeyUp方法。另一种是在jni层实现,监控/dev/input/event0键盘输入设备,获取输入数据。第一种方法缺陷是当有多个键盘设备时候无法区分是哪个键盘输入的,第二种方法是需要有该文件的读写权限。
调试方法
进入adb模式
adb shell
输入以下指令监控键盘输入
getevent

方法1实现
代码实现
@Override
public boolean onKeyDown(int keyCode,KeyEvent event){
switch(keyCode){
case KeyEvent.KEYCODE_0:
testview.setText("按下按键0");
break;
case KeyEvent.KEYCODE_1:
testview.setText("按下按键1");
break;
case KeyEvent.KEYCODE_2:
testview.setText("按下按键2");
break;
case KeyEvent.KEYCODE_3:
testview.setText("按下按键3");
break;
case KeyEvent.KEYCODE_4:
testview.setText("按下按键4");
break;
case KeyEvent.KEYCODE_5:
testview.setText("按下按键5");
break;
case KeyEvent.KEYCODE_6:
testview.setText("按下按键6");
break;
case KeyEvent.KEYCODE_7:
testview.setText("按下按键7");
break;
case KeyEvent.KEYCODE_8:
testview.setText("按下按键8");
break;
case KeyEvent.KEYCODE_9:
testview.setText("按下按键9");
break;
case KeyEvent.KEYCODE_DEL:
testview.setText("按下按键*");
break;
case KeyEvent.KEYCODE_ENTER:
testview.setText("按下按键#");
break;
default:
testview.setText("无法识别输入");
break;
}
return super.onKeyDown(keyCode, event);
}
/*释放按键事件*/
@Override
public boolean onKeyUp(int keyCode,KeyEvent event){
switch(keyCode){
case KeyEvent.KEYCODE_0:
testview.setText("放开按键0");
break;
case KeyEvent.KEYCODE_1:
testview.setText("放开按键1");
break;
case KeyEvent.KEYCODE_2:
testview.setText("放开按键2");
break;
case KeyEvent.KEYCODE_3:
testview.setText("放开按键3");
break;
case KeyEvent.KEYCODE_4:
testview.setText("放开按键4");
break;
case KeyEvent.KEYCODE_5:
testview.setText("放开按键5");
break;
case KeyEvent.KEYCODE_6:
testview.setText("放开按键6");
break;
case KeyEvent.KEYCODE_7:
testview.setText("放开按键7");
break;
case KeyEvent.KEYCODE_8:
testview.setText("放开按键8");
break;
case KeyEvent.KEYCODE_9:
testview.setText("放开按键9");
break;
case KeyEvent.KEYCODE_DEL:
testview.setText("放开按键*");
break;
case KeyEvent.KEYCODE_ENTER:
testview.setText("放开按键#");
break;
default:
testview.setText("无法识别输入");
break;
}
return super.onKeyUp(keyCode, event);
}
方法2实现
赋予可读写权限
C:\Users\liang>adb shell
root@octopus-f1:/ # chmod 777 /dev/input/event6
代码实现
#include <stdio.h>
#include <linux/input.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include"Logger.h"
#include<pthread.h>
#include"com_example_liang_myapplication_KeyBoard.h"
#define DEV_PATH "/dev/input/event6" //difference is possible
static void* pthread_read_keyboard(void*){
int keys_fd;
char ret[2];
struct input_event t;
keys_fd=open(DEV_PATH, O_RDONLY);
if(keys_fd <= 0)
{
LOGE("%s device error!\n",DEV_PATH);
}
for(;;){
usleep(500);
if(read(keys_fd, &t, sizeof(t)) == sizeof(t))
{
if(t.type==EV_KEY)
if(t.value==0 || t.value==1)
{
LOGE("key %d %s\n", t.code, (t.value) ? "Pressed" : "Released");
if(t.code == KEY_ESC)
break;
}
}
}
LOGE("pthread_read_keyboard exit\n");
close(keys_fd);
}
自己写的
DEMO
android键盘输入读取的更多相关文章
- java Scanner与BufferedReader读取键盘输入性能比较
java Scanner与BufferedReader读取键盘输入性能比较 1.Scanner和BufferedReader 性能比较 在java中常见的从键盘获取输入的方式有 ...
- Android系统--输入系统(八)Reader线程_使用EventHub读取事件
Android系统--输入系统(八)Reader线程_使用EventHub读取事件 1. Reader线程工作流程 获得事件 size_t count = mEventHub->getEvent ...
- [Python] python3 文件操作:从键盘输入、打开关闭文件、读取写入文件、重命名与删除文件等
1.从键盘输入 Python 2有两个内置的函数用于从标准输入读取数据,默认情况下来自键盘.这两个函数分别是:input()和raw_input(). Python 3中,不建议使用raw_input ...
- python通过标准输入读取内容,读取键盘输入的内容?接收用户输入?
需求说明: 在交互式脚本中,需要用户手动输入内容,并对内容进行处理.在这里记录下通过 python的内置函数input()读取标注输入的内容.默认的标准输入是键盘. 操作过程: 1.通过input() ...
- Android - 隐藏EditText弹出的软键盘输入(SoftInput)
隐藏EditText弹出的软键盘输入(SoftInput) 本文地址: http://blog.csdn.net/caroline_wendy 保持界面的整洁, 能够选择在进入界面时, 隐藏EditT ...
- Python打印到屏幕_读取键盘输入
Python打印到屏幕_读取键盘输入: print( ): 打印输出括号中的值 print("hello") # hello strs = 'hello' print(" ...
- C语言实现数据机构链表的基本操作(从键盘输入生成链表、读取数组生成链表)
利用头插法实现逆置 下面简单介绍一下,算法思想结合图示看 算法思想:"删除"头结点与链表其他结点的原有联系(即将头结点的指针置空),再逐个插入逆置链表的表头(即"头插&q ...
- Android系统--输入系统(五)输入系统框架
Android系统--输入系统(五)输入系统框架 1. Android设备使用场景: 假设一个Android平板,APP功能.系统功能(开机关机.调节音量).外接设备功能(键盘.触摸屏.USB外接键盘 ...
- Android系统--输入系统(七)Reader_Dispatcher线程启动分析
Android系统--输入系统(七)Reader_Dispatcher线程启动分析 1. Reader/Dispatcher的引入 对于输入系统来说,将会创建两个线程: Reader线程(读取事件) ...
随机推荐
- 实现数据库的跨库join
功能需求 首先要理解原始需求是什么,为什么要跨库join.举个简单的例子,在日志数据库log_db有一份充值记录表pay_log,里面的用户信息只有一个userid:而用户的详细信息放在主库main_ ...
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...
- _web基础_servlet基础
一.了解Servlet的概念 Servlet定义:Servlet是基于Java技术的Web组件,由容器管理并产生动态的内容.Servlet引擎作为WEB服务器的扩展提供支持Servlet的功能.Ser ...
- C++:通过gethostbyname函数,根据服务器的域名,获取服务器IP
本代码的编译环境为MAC,系统版本为10.11.6: #include <string.h> #include <netdb.h> #include <stdio.h&g ...
- Gson将字符串转换成JsonObject和JsonArray
以下均利用Gson来处理: 1.将bean转换成Json字符串: public static String beanToJSONString(Object bean) { return new Gso ...
- cocoapods安装
什么是cocoapods CocoaPods是一个用来帮助我们管理第三方依赖库的工具.它可以解决库与库之间的依赖关系,下载库的源代码,同时通过创建一个Xcode的workspace来将这些第三方库和我 ...
- 使用Navicat在oracle XE上新建表空间、用户及权限赋予
参考资料: 烂泥:使用Navicat for Oracle新建表空间.用户及权限赋予 - 烂泥行天下 - 51CTO技术博客http://ilanni.blog.51cto.com/526870/12 ...
- python网络编程
Socket是网络编程的一个抽象的概念. 通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 套 ...
- Tlist删除技巧
二. 从TList开始分析-- 为了写一个更好的性能ISAPI Filter,我需要更快速地从TList中删除部分连续的Item.比如这样的一段代码: var p : pChar = 'abcd ...
- Java学习笔记-按值传递
参数的值传递 实参必须与方法中次你故意的参数在次序和数量上匹配,在类型上兼容.类型兼容是指不需要经过显式的类型转换,实参的值就可以传递给形参.如将int型的实参值传递给double型形参. 当调用方法 ...