日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

用Android UEventObserver监听内核event

發布時間:2023/12/20 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Android UEventObserver监听内核event 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

很多時候我們在框架上層需要知道內核中某些事件的狀態,用設備的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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。