android input设备event处理以及hotplug检测

2024-04-22 17:48

本文主要是介绍android input设备event处理以及hotplug检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://wb127.blog.51cto.com/2232662/793116

android平台2.3.4,发现插上usb鼠标和键盘开机,那么都能正常使用,一旦拔出以后再插回去,就不能使用了。

首先检测/dev/input下的设备节点是否正常,发现拔出和插入设备,节点文件都能正常删除和创建。

# ls /dev/input/ -al
total 8
drwxrwxrwx    2 root     root          4096 Feb 29  2012 ./
drwxrwxrwx    7 default  default       4096 Feb 29  2012 ../
crw-r-----    1 root     root       13,  63 Feb 28  2012 mice

插入鼠标:

# ls /dev/input/ -al
total 8
drwxrwxrwx    2 root     root          4096 Feb 29  2012 ./
drwxrwxrwx    7 default  default       4096 Feb 29  2012 ../
crw-r-----    1 root     root       13,  64 Feb 29  2012 event0
crw-r-----    1 root     root       13,  63 Feb 28  2012 mice
crw-r-----    1 root     root       13,  32 Feb 29  2012 mouse0

再插入键盘:

# ls /dev/input/ -al
total 8
drwxrwxrwx    2 root     root          4096 Feb 29  2012 ./
drwxrwxrwx    7 default  default       4096 Feb 29  2012 ../
crw-r-----    1 root     root       13,  64 Feb 29  2012 event0
crw-r-----    1 root     root       13,  65 Feb 29  2012 event1
crw-r-----    1 root     root       13,  63 Feb 28  2012 mice
crw-r-----    1 root     root       13,  32 Feb 29  2012 mouse0

直接cat /dev/input/event0,然后晃动鼠标,能看见有接收到消息。说明kernel这一层的input系统工作正常。问题应该在android内部。

打开logcat,查看拔插消息,发现如下打印:

如果鼠标正常时拔除:
E/EventHub( 1202): remove device: /dev/input/mouse0 not found
I/EventHub( 1202): Removed device: path=/dev/input/event0 name=Logitech USB Optical Mouse id=0x10001 (of 0x2) index=3 fd=76 classes=0x8
I/InputReader( 1202): Device removed: id=0x10001, name=Logitech USB Optical Mouse, sources=00010004

如果已经拔出过,再次插入拔出时:

E/EventHub( 1202): remove device: /dev/input/mouse0 not found
E/EventHub( 1202): remove device: /dev/input/event0 not found
 

插入鼠标时:
E/EventHub( 1202): could not open /dev/input/mouse0, Permission denied
E/EventHub( 1202): could not open /dev/input/event0, Permission denied

android的设备检测由两部分来合作:
1.Init - system/core/init/负责处理uevent消息并在/dev下建立相关节点文件
system/core/init/devices.c
2.EventHub - frameworks/base/libs/ui/处理/dev/input/下的节点文件,监测是否有文件新建(IN_CREATE)
frameworks/base/libs/ui/EventHub.cpp

当init使用mknod()在/dev下建立节点文件,文件的owner和group都是root。然后根据需要使用chown()改变起ower和group属性。对于/dev/input/下的节点文件,group变为input。但是EventHub随时随刻都在监测/dev/input/event*,在init创建节点但是还没有执行chown时,此时EventHub没有权限去打开。

为了验证这个理论,你可以自己写一个模块,在其初始化函数里面在/dev/input使用evdev创建节点文件event*,然后insmod这个模块,你会在logcat里面看见对应的event*无法打开,和我们开头的出错信息一样:
E/EventHub(  953): could not open /dev/input/event3, Permission denied
 

以下是修改内容:

--- old/system/init/devices.c
+++ new/system/init/devices.c
 
@@ -209,8 +209,10 @@ static void make_device(const char *path, int block, int major, int minor)
 
mode = get_device_perm(path, &uid, &gid) | (block ? S_IFBLK : S_IFCHR);
dev = makedev(major, minor);
- mknod(path, mode, dev);
- chown(path, uid, -1);
+ unlink("/dev/.initdev");
+ mknod("/dev/.initdev", mode, dev);
+ chown("/dev/.initdev", uid, -1);
+ rename("/dev/.initdev", path);

}
 

--- old/frameworks/base/libs/ui/EventHub_old.cpp    2012-02-29 23:48:42.000000000 +0800
+++ new/frameworks/base/libs/ui/EventHub.cpp        2012-02-29 23:49:15.000000000 +0800
@@ -515,7 +515,7 @@
     mDevices[0] = NULL;
 #ifdef HAVE_INOTIFY
     mFDs[0].fd = inotify_init();
-    res = inotify_add_watch(mFDs[0].fd, device_path, IN_DELETE | IN_CREATE);
+    res = inotify_add_watch(mFDs[0].fd, device_path, IN_DELETE | IN_CREATE | IN_MOVED_TO);
     if(res < 0) {
         LOGE("could not add watch for %s, %s\n", device_path, strerror(errno));
     }
@@ -955,7 +955,7 @@
         //printf("%d: %08x \"%s\"\n", event->wd, event->mask, event->len ? event->name : "");
         if(event->len) {
             strcpy(filename, event->name);
-            if(event->mask & IN_CREATE) {
+            if(event->mask & (IN_CREATE | IN_MOVED_TO))
                 openDevice(devname);
             }
             else {


这篇关于android input设备event处理以及hotplug检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/926450

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动