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的列表,主要接口get
DefaultSensor,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)