Android传感器_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Android传感器

Android传感器

 2012/2/7 9:42:12  f120412352  程序员俱乐部  我要评论(0)
  • 摘要:Android传感器Android系统有很多传感器(Sensor),让Android应用更加丰富多样性,比如距离传感器,可应用于防止触屏手机以外挂断电话。磁力传感器可以作指南针使用。亮度传感器可以甄别环境光线亮度,随时调整自身屏幕亮度达到最佳效果。等等,还有很多。从Sensor.java(frameworks\base\core\java\android\hardware)这个文件中我们可以找到android2.0支持哪些传感器类型:加速器TYPE_ACCELEROMETER=1
  • 标签: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)
发表评论
用户名: 匿名