Android傳感器

Android傳感器

Android系統有很多傳感器(Sensor),讓Android應用更加豐富多樣性,比如距離傳感器,可應用於防止觸屏手機以外掛斷電話。磁力傳感器可以作指南針使用。亮度傳感器可以甄別環境光線亮度,隨時調整自身屏幕亮度達到最佳效果。等等,還有很多。
從Sensor.java (frameworks\base\core\java\android\hardware) 這個文件中我們可以找到android2.0支持哪些傳感器類型:
加速器 TYPE_ACCELEROMETER = 1;
磁力域 TYPE_MAGNETIC_FIELD = 2;
方向 TYPE_ORIENTATION = 3;
陀螺儀 TYPE_GYROSCOPE = 4;
亮度 TYPE_LIGHT = 5;
壓力 TYPE_PRESSURE = 6;
溫度 TYPE_TEMPERATURE = 7;
接近 TYPE_PROXIMITY = 8;
通過SensorManager(SensorManager.java (frameworks\base\core\java\android\hardware))統一管理,實現傳感器系統核心管理類
android.hardware.Sensor是單一傳感器描述類
android.hardware.SensorEvent是傳感器事件類
android.hardware.SensorEventListener傳感器事件監聽類
android.hardware.SensorListener直接讀取Sensor而非Sensor事件,這樣做可能帶來一些弊端,還是有封裝好的SensorEvent來完成吧

Framework層由Sensor ,SensorListener,SensorEvent ,SensorEventListener構成 ==>
JNI層由android_hardware_SensorManager.cpp (frameworks\base\core\jni) 構成 ==>
硬件層實現接口爲Sensors.h (hardware\libhardware\include\hardware)

從下而上
Sensor HAL硬件抽象層
每種硬件模塊都會有一個數據結構HAL_MODULE_INFO_SYM一般都是以hw_module_t開頭,sensor的硬件模塊數據結構定義在
struct sensors_module_t {
struct hw_module_t common;
/**
* Enumerate all available sensors. The list is returned in "list".
* @return number of sensors in the list
*/
int (*get_sensors_list)(struct sensors_module_t* module,
struct sensor_t const** list);
};

傳感器的數據描述sensors_data_t
typedef struct {
int sensor;標識
union {
sensors_vec_t vector; /* sensor 矢量x,y,z */
sensors_vec_t orientation;//方向矢量
sensors_vec_t acceleration;//加速度米每秒每秒 (m/s^2)
sensors_vec_t magnetic;//磁力矢量in micro-Tesla (uT)
float temperature; //溫度 (Celsius)
float distance;//距離 釐米
float light;//光的強度 lux
};
int64_t time;//時間 nanosecond
uint32_t reserved;
} sensors_data_t;

Sensor的數據設備
struct sensors_control_device_t {
struct hw_device_t common;
native_handle_t* (*open_data_source)(struct sensors_control_device_t *dev);// sensors_data_device_t::open_data()的一個參數
int (*close_data_source)(struct sensors_control_device_t *dev);
int (*activate)(struct sensors_control_device_t *dev, int handle, int enabled);
int (*set_delay)(struct sensors_control_device_t *dev, int32_t ms);
int (*wake)(struct sensors_control_device_t *dev);
};

Sensor數據設備:
struct sensors_data_device_t {
struct hw_device_t common;
int (*data_open)(struct sensors_data_device_t *dev, native_handle_t* nh);
int (*data_close)(struct sensors_data_device_t *dev);
int (*poll)(struct sensors_data_device_t *dev,
sensors_data_t* data);//返回sensor數據
};
sensors_data_t數據結構中的數值,是最終傳感器傳出的數據,在傳感器的硬件抽象層中,需要構建這個數據。
還有sensor的描述數據結構:sensor_t(sensor的描述,包括名稱、版本、製造商、句柄,傳感器類型、分辨率,最大值,功耗(mA)等

Sensor HAL具體實現可以參考emulator的代碼Sensors_qemu.c(development\emulator\sensors)可以看到sSensorListInit是sensor_t的list
open_sensors()是具體實現

SensorManager主要是維護一個Sensor的列表,主要接口getDefaultSensor,getSensorList,registerListener,unregisterListener
Sensor的主要接口getMaximumRange,getName,getPower,getResolution,getType,getVendor,getVersion這些就是我們sensor_t結構的內容
SensorEvent很簡單的,就只有Sensor,數值,精度和時間戳
SensorEventListener監聽SensorEvent比如數值,精度的變化等

傳感器的應用層使用:
可以參考這個自帶的例子
SensorTest.java (development\samples\apidemos\src\com\example\android\apis\graphics)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章