用Android UEventObserver监听内核event
发布日期:2021-06-30 18:53:48
浏览次数:2
分类:技术文章
本文共 2238 字,大约阅读时间需要 7 分钟。
很多时候我们在框架上层需要知道内核中某些事件的状态,用设备的show属性是可以供上层来查询,但是这需要上层设定一个较耗资源的循环。如果用UEventObserver就可以监听内核event,它是android Java层利用uevent与获取Kernel层状态变化的机制。
(1)UEventObserver简介
framework有如下模块使用UEventObserver的功能来提供服务:
电池状态:services/java/com/android/server/BatteryService.java,
耳机状态:services/java/com/android/server/HeadsetObserver.java, DOCK状态:services/java/com/android/server/DockObserver.java, USB状态:services/java/com/android/server/usb/UsbService.java。 它们全部继承自UEventObserver,先看看这个类的构造和原理: ./core/java/android/os/UEventObserver.java | [ native_setup(), next_event() ] |/ ./core/jni/android_os_UEventObserver.cpp | [ uevent_init(),uevent_next_event() ] |/ /hardware/libhardware_legacy/uevent/uevent.c | [userspace] ———————[socket]—————————————————————————– | |/ [kernel] socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT)核心响应函数是:继承UEventObserver的类必须实现自己的public abstract void onUEvent(UEvent event),在这里面进行获取状态后的处理。
(2)实例,在上层服务中监听摄像头的打开和关闭,并作相应处理。需要内核摄像头驱动中也要发出event事件才行,所以改动分为内核和上层两部分。A,内核摄像头驱动中的改动:
[cpp] view plaincopy
static atomic_t g_CamHWOpend; //camera是否打开成功的标志 struct device* sensor_device = NULL; static void set_camera_status() { char *envp[2]; int ret = atomic_read(&g_CamHWOpend)? 1 : 0; if(ret) envp[0] = “STATUS=OPEN”; else envp[0] = “STATUS=CLOSE”; envp[1] = NULL; kobject_uevent_env(&sensor_device->kobj, KOBJ_CHANGE, envp); //将evnp通过kobject上报 return; } 在打开摄像头和关闭摄像头的函数中,成功打开和成功关闭的位置都要放置set_camera_status函数。B,上层某个服务中的改动:
导入类:
[java] view plaincopy
import android.os.UEventObserver; 在服务的onCreate函数中启动UEventObserver,启动的路径要根据uevent规则来匹配,具体要去目录下寻找:[java] view plaincopy
m_CameraStatusObserver.startObserving(“DEVPATH=/devices/virtual/sensordrv/kd_camera_hw”); UEventObserver型变量的创建:[java] view plaincopy
private UEventObserver m_CameraStatusObserver = new UEventObserver(){ public void onUEvent(UEvent event){ //完成抽象的核心响应函数 String status = event.get(“STATUS”); //没有取特定长度字符串,直接取=前面的子串 Log.i(TAG,”camera app operation and mCameraOpenInSS is “+mCameraOpenInSS); if( “OPEN”.equals(status)){ Log.i(TAG,”camera app open”); //如果打开摄像头做。。处理 } else if (“CLOSE”.equals(status)){ Log.i(TAG,”camera app close”); //如果关闭摄像头做。。处理 } } }; 在服务的onDestroy函数中加上停止监听:[java] view plaincopy
m_CameraStatusObserver.stopObserving(); 这样就完成了上层对底层设备状态的响应处理。参考原文:参考原文:
转载地址:https://linus.blog.csdn.net/article/details/50439981 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月24日 03时59分08秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
攻防世界web进阶区ics-07详解
2019-04-30
攻防世界web进阶区unfinish详解
2019-04-30
攻防世界web进阶区i-got-id-200超详解
2019-04-30
sql注入总结学习
2019-04-30
leetcode46 全排列
2019-04-30
leetcode121 买卖股票的最佳时机
2019-04-30
leetcode 122 买卖股票的最佳时机II
2019-04-30
leetcode 309 最佳买卖股票含冷冻期
2019-04-30
leetcode 714 买卖股票的最佳时机含手续费
2019-04-30
leetcode3 无重复字符的最长子串
2019-04-30
leetcode 76 最小覆盖子串
2019-04-30
leetcode 1143. 最长公共子序列
2019-04-30
leetcode 83. 删除排序链表中的重复元素
2019-04-30
智能体 Intelligent Agent
2019-04-30
Network Compression网络压缩(一)
2019-04-30
GAN系列(零)—— GAN的发展(两条路线)
2019-04-30
Conditional GAN (CGAN) 条件生成网络
2019-04-30
强化学习(三) —— Policy Gradient 策略梯度
2019-04-30
docker安装oracle(win10)
2019-04-30
Cloudera Quickstart & HUE
2019-04-30