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)
分享到:
相关推荐
ANDROID传感器开发.pdf
本书主要介绍Android传感器和外设的开发,共29章,主要包括Android开发技术基础、获取并编译源码、Android技术核心框架分析、Android传感器系统分析、使用地图定位、光线传感器详解、接近警报传感器详解、磁场传感器...
利用android传感器实现手机摇一摇解除闹铃,让你不再继续赖床
Android传感器应用之摇一摇小球运动实现 看代码吧
android传感器(加速度、方位、光线)示例源码
Android课程,蓝牙,android传感器,无线传输与媒体硬件功能开发
《Android传感器高级编程》利用你所需的知识和代码来武装你,帮助你很好地利用Android中的传感器。从确定智能手机的位置和解释物理传感器,到处理图像、音频和识别语音,你将学会如何有效地调用传感器相关的API。...
提供了android传感器 详细的使用方法 有步骤讲解还有源代码样例
手机拍摄转PDF,清晰,带完整书签 Android传感器高级编程,中文版,清华大学出版社,481页 ISBN 9787302340775
android 传感器 操作代码 protected void onResume() { super.onResume(); sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_...
极客学院Android传感器源码及PPT。包括以前有人百度网盘分享的极客学院course011.7z文件。是Android传感器(如蓝牙、照相机、NFC等)源码。
详细解释andorid上传感器的应用,包括GPS定位传感器,light sensor,等等
Wrox.Professional.Android.Sensor.Programming.2012
Android 传感器(Sensor)API教程 (六) 加速度传感器运用实例 Android 传感器(Sensor)API教程 (六) 加速度传感器运用实例
Android传感器、无线传输与媒体硬件功能开发视频教程
Android传感器开发实例,学习用。两个Activity,一个用来查看手机里的传感器的个数和种类,另一个是小游戏,用加速度传感器控制小球的位置。
Android传感器高级编程源码包含已编译好的apk文件