很多时候我们在框架需要知道内核中某些事件的状态,用设备的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,内核摄像头驱动中的改动:

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";elseenvp[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();

这样就完成了上层对底层设备状态的响应处理。

(3)关于udev路径

举一个碰到的例子,misc设备

static struct miscdevice vechile_dev = {.minor      = MISC_DYNAMIC_MINOR,.name     = "vehicle",.fops        = &vechile_fops,
};

上层监控路径
auxObserver.startObserving("DEVPATH=/devices/virtual/misc/vehicle");

参考原文:http://blog.csdn.net/darkengine/article/details/7442359

用Android UEventObserver监听内核uevent相关推荐

  1. android 应用使用 UEventObserver监听内核uevent 事件

    很多时候我们在框架需要知道内核中某些事件的状态,用设备的show属性是可以供上层来查询,但是这需要上层设定一个较耗资源的循环.如果用UEventObserver就可以监听内核event,它是andro ...

  2. 用Android UEventObserver监听内核event

    很多时候我们在框架上层需要知道内核中某些事件的状态,用设备的show属性是可以供上层来查询,但是这需要上层设定一个较耗资源的循环.如果用UEventObserver就可以监听内核event,它是and ...

  3. Android监听左右滑删除通知,Android 滑动监听RecyclerView线性流+左右划删除+上下移动...

    废话不多说了,直接给大家贴代码了.具体代码如下所示: xmlns:tools="http://schemas.android.com/tools" android:layout_w ...

  4. Android 监听 Android中监听系统网络连接打开或者关闭的实现代码

    本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...

  5. Android RecyclerView 监听滑动

    今天,简单讲讲Android 如何监听滑动. 不废话了,主要是需要做一个功能,实现RecyclerView滑动时,让一个标题栏固定显示在顶部. 基本知识: 列表的滚动一般分为两种: 手指按下 -> ...

  6. android 如何监听应用前后台切换

    今天,简单讲讲android如何判断应用切换到后台和应用切换到前台. 这个其实很简单,之前需要做一个功能,当app由后台进入前台时需要完成一些逻辑操作,所以在网上查找如何判断app由后台进入前台,最终 ...

  7. java edittext 输入监听_Android应用开发之Android EditText 监听用户输入完成的实例

    本文将带你了解Android应用开发Android EditText 监听用户输入完成的实例,希望本文对大家学Android有所帮助. 我们都知道, Android   EditText输入框,并没有 ...

  8. Android查看web日志,详解Android WebView监听console错误信息

    根据需求,我们要拿到h5的错误信息,并将error信息进行上报.查询了下Android WebView的API发现了WebChromeClient这个方法可以满足要求: @Override publi ...

  9. android listview ontouchlistener,Android ListView监听滑动事件的方法(详解)

    ListView的主要有两种滑动事件监听方法,OnTouchListener和OnScrollListener 1.OnTouchListener OnTouchListener方法来自View中的监 ...

最新文章

  1. 2019-4-25 html学习笔记
  2. poj3621 Sightseeing Cows --- 01分数规划
  3. Ollivander's Inventory(连接查询、单表双实例、子查询)
  4. Win7下用IIS发布网站
  5. 在windowService用Process.Start()启动程序没有界面-记录
  6. Tomcat maven 插件启动出现tomcat\conf\tomcat-users.xml cannot be read异常解决方法
  7. 【SSL】使用Keytool工具生成证书及签名完整步骤
  8. 2017-2018-1 20155320 实验三——实时系统
  9. webservice传递特殊字符时的解决的方法
  10. 第八章,作业(网络电视精灵)
  11. VB控件注册 - 利用资源文件将dll、ocx打包进exe文件
  12. 出入库管理软件如何修改格式
  13. 测试工具学习——JMeter
  14. 移动互联网产品数据分析
  15. vmbox主机和虚拟机无法共通网络服务 主机无法使用虚拟机的网络服务 虚拟机无法使用主机的网络服务
  16. 【问题】连接mysql报错errorCode 0, state 08S01
  17. 数据结构循环队列C++实现
  18. 非参数估计:核密度估计KDE
  19. F005MyBatis学习笔记-MyBatis的多表关联查询
  20. 计算机考试感受作文,关于考试感受作文5篇

热门文章

  1. 佳能发布19um像素的全高清视频传感器
  2. 数字图像处理-图像压缩
  3. Sql Server2019安装 等待数据库引擎恢复句柄失败
  4. 勇者与羁绊 游戏开发日志(八)
  5. 前端两栏布局和三栏布局
  6. 离线仓库模块开发:指标统计开发|数据导出|工作流调度
  7. cropperjs裁剪上传头像使用方法
  8. 2021-10-14每日一练
  9. 5.1使用css修改网页元素
  10. Java网页数据采集器[上篇-数据采集]