用Android UEventObserver监听内核event
来源:互联网 发布:java开发人员平均年龄 编辑:程序博客网 时间:2024/05/16 16:16
(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,内核摄像头驱动中的改动:
- 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,上层某个服务中的改动:
导入类:
- import android.os.UEventObserver;
在服务的onCreate函数中启动UEventObserver,启动的路径要根据uevent规则来匹配,具体要去目录下寻找:
- m_CameraStatusObserver.startObserving("DEVPATH=/devices/virtual/sensordrv/kd_camera_hw");
UEventObserver型变量的创建:
- 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函数中加上停止监听:
- m_CameraStatusObserver.stopObserving();
- 用Android UEventObserver监听内核event
- 用Android UEventObserver监听内核event
- 用Android UEventObserver监听内核event
- 用Android UEventObserver监听内核uevent
- Android UEventObserver
- Android UEventObserver
- Android UEventObserver
- Android UEventObserver
- android UEventObserver
- Android UEventObserver
- android UEventObserver的用法
- Android UEventObserver 使用
- android UEventObserver的用法
- android之UEventObserver分析
- Android uevent监控 UEventObserver
- android UEventObserver的用法
- Android uevent监控 UEventObserver
- android之UEventObserver分析和用法
- 计算机网络在电子商务中的应用研究
- powerDesigner学习一_概念模型
- Oracle Instance Client + PL/SQL Developer远程访问数据库(Windows)
- WEBAPP开发技巧总结
- ARP
- 用Android UEventObserver监听内核event
- 数据库更新操作方法一
- 网页中出现莫名其妙的空隙引号
- cocos2dx3.0正式版 屏幕分辨率自适应
- jdk自带访问https和apache httpclient访问htts的SLL报错处理
- Android浏览图片,点击放大至全屏效果
- 求三元组的最值问题
- UVa 10004 - Bicoloring
- blank