很多时候我们在框架上层需要知道内核中某些事件的状态,用设备的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();
这样就完成了上层对底层设备状态的响应处理。

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

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

  1. 用Android UEventObserver监听内核uevent

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

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

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

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

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

  4. android动态加home,Android 解决监听home键的几种方法

    Android 解决监听home键的几种方法 前言: 以下两种方法可以完美解决监听back键,home键,多任务键(最近任务键). 一.使用注册广播监听home键.多任务键 演示图 创建一个广播代码如 ...

  5. android触摸滑动监听,Android 滑动监听的实例详解

    Android 滑动监听的实例详解 摘要: ScollBy,ScollTo是对内容的移动,view.ScollyBy是对view的内容的移动 view,ScollTo是对内容的移动(移动到指定位置), ...

  6. android 输入法 监听,android 监听 输入法

    场景:android 应用监听输入法按键事件[例如搜索和回车键等]的整个流程分析 android 应用监听输入法按键事件[比如搜索和回车键等]的整个流程分析 继承于InputMethodService ...

  7. Android 如何监听返回键,弹出一个退出对话框

    Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. 注:如下代码当时是从网上copy过来的,现在忘了它 ...

  8. android设置返回按钮无效,Android onKeyDown监听返回键无效的解决办法

    Android onKeyDown监听返回键无效的解决办法 当我们的Activity继承了TabActivity,在该类中重写onKeyDown是监听不到返回键的, 具体解决方法如下: 重写dispa ...

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

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

最新文章

  1. 被swoole坑哭的PHP程序员
  2. 多备份cloud 5技术:传统数据备份思路的完美移植
  3. 基于OSSIM的漏洞***测试视频教程
  4. pip keras 失败_关于 Python 机器学习导包失败 简短的补充
  5. 【爬虫】爬取带有cookie才能获取网页内容的新闻网站
  6. Navicat连接mysql8.0.1版本出现1251--Client
  7. 多语言界面 Web 站点的几个 Tip
  8. 数据库工作笔记008---mysql开启远程访问权限_ 1042 Can't get hostname for your address_Access denied for user 'root'@'
  9. 当个性化推荐遇上知识图谱.pdf(附下载链接)
  10. Android 屏幕旋转时保存状态
  11. 局域网共享工具_局域网一键共享软件2019最新版
  12. 税务信息化与计算机技术应用开发,税务信息化与计算机技术应用开发工作岗位年度个人工作总结...
  13. 【ABAP】采购订单行项目 税码 自动默认
  14. 牛客网练习,某公司2017秋招。叫车 2017年
  15. OpenWrt之DNS设置
  16. 正式发售超两周 iPhone7部分机型仍然缺货
  17. python人物抠图算法_比PS还好用!Python 20行代码批量抠图
  18. 电脑音频服务器未修复咋办,音频服务未运行怎么办?win7和win10电脑没声音了恢复方法...
  19. 仿猫眼php,微信小程序 仿猫眼实现实例代码
  20. 如何使用命令在navicat中操作

热门文章

  1. 解决Vmware中安装Ubuntu Server 14.04 分辨率无法全屏问题
  2. The Event System
  3. nodejs+redis
  4. Android应用开发—onSaveInstanceState方法什么时候被调用?
  5. 二叉树、树和有序树的区别
  6. 计算机二级access选择题技巧,计算机二级access考试注意事项及解题技巧策略
  7. 镜像上传到linux失败,Docker push镜像失败解决方法
  8. Django的信号机制详解
  9. 解决: 'Cannot call `.is_valid()` as no `data=` keyword argument was ' AssertionError: Cannot call `
  10. Python面向切面编程是什么