Android传感器开发基本流程

[java]  view plain copy
  1. public class SensorActivity extends Activity implements SensorEventListener {  
  2.   private SensorManager mSensorManager;  
  3.   private Sensor mSensor;  
  4.   
  5.   @Override  
  6.   public final void onCreate(Bundle savedInstanceState) {  
  7.     super.onCreate(savedInstanceState);  
  8.     setContentView(R.layout.main);  
  9.     //第一步:通过getSystemService获得SensorManager实例对象  
  10.     mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);  
  11.     //第二步:通过SensorManager实例对象获得想要的传感器对象:参数决定获取哪个传感器  
  12.     mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);  
  13.   }  
  14.   
  15.   //第四步:必须重写的两个方法:onAccuracyChanged,onSensorChanged  
  16.   /** 
  17.    * 传感器精度发生改变的回调接口 
  18.    */  
  19.   @Override  
  20.   public final void onAccuracyChanged(Sensor sensor, int accuracy) {  
  21.     //TODO 在传感器精度发生改变时做些操作,accuracy为当前传感器精度  
  22.   }  
  23.   
  24.   /** 
  25.    * 传感器事件值改变时的回调接口:执行此方法的频率与注册传感器时的频率有关 
  26.    */  
  27.   @Override  
  28.   public final void onSensorChanged(SensorEvent event) {  
  29.     // 大部分传感器会返回三个轴方向x,y,x的event值,值的意义因传感器而异  
  30.     float x = event.values[0];  
  31.     float y = event.values[1];  
  32.     float z = event.values[2];  
  33.     //TODO 利用获得的三个float传感器值做些操作  
  34.   }  
  35.   
  36.   /** 
  37.    * 第三步:在获得焦点时注册传感器并让本类实现SensorEventListener接口 
  38.    */  
  39.   @Override  
  40.   protected void onResume() {  
  41.     super.onResume();  
  42.     /* 
  43.      *第一个参数:SensorEventListener接口的实例对象 
  44.      *第二个参数:需要注册的传感器实例 
  45.      *第三个参数:传感器获取传感器事件event值频率: 
  46.    *              SensorManager.SENSOR_DELAY_FASTEST = 0:对应0微秒的更新间隔,最快,1微秒 = 1 % 1000000秒 
  47.    *              SensorManager.SENSOR_DELAY_GAME = 1:对应20000微秒的更新间隔,游戏中常用 
  48.    *              SensorManager.SENSOR_DELAY_UI = 2:对应60000微秒的更新间隔 
  49.    *              SensorManager.SENSOR_DELAY_NORMAL = 3:对应200000微秒的更新间隔 
  50.    *              键入自定义的int值x时:对应x微秒的更新间隔 
  51.      * 
  52.      */  
  53.     mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);  
  54.   }  
  55.   
  56.   /** 
  57.    * 第五步:在失去焦点时注销传感器 
  58.    */  
  59.   @Override  
  60.   protected void onPause() {  
  61.     super.onPause();  
  62.     mSensorManager.unregisterListener(this);  
  63.   }  
  64. }  

总结起来大致有5步: 第一步:获取SensorManager对象 第二步:获取Sensor对象 第三步:注册Sensor对象 第四步:重写onAccuracyChanged,onSensorChanged这两个方法 第五步:注销Sensor对象

Android设备中传感器的基本类型


利用SensorManager获取传感器: [java]  view plain copy
  1. mSensor = mSensorManager.getDefaultSensor(int TYPE);//TYPE为Sensor中定义的static final 值  

请参考下面Sensor.java中定义的部分TYPE值:
[java]  view plain copy
  1. /** 
  2.  * 获取加速度感应器的常量 
  3.  */  
  4. public static final int TYPE_ACCELEROMETER = 1;  
  5.   
  6. /** 
  7.  * 获取磁场感应器的常量 
  8.  */  
  9. public static final int TYPE_FIELD = 2;  
  10.   
  11. /** 
  12.  * 获取方向感应器的常量,已过时 
  13.  */  
  14. @Deprecated  
  15. public static final int TYPE_ORIENTATION = 3;  
  16.   
  17. /**  
  18.  * 获取陀螺仪感应器的常量 
  19.  */  
  20. public static final int TYPE_GYROSCOPE = 4;  
  21.   
  22. /** 
  23.  * 获取光线感应器的常量 
  24.  */  
  25. public static final int TYPE_LIGHT = 5;  
  26.   
  27. /** 
  28.  * 获取压力感应器的常量 
  29.  */  
  30. public static final int TYPE_PRESSURE = 6;  
  31.   
  32. @Deprecated  
  33. public static final int TYPE_TEMPERATURE = 7;//获取温度传感器,已过时  
  34.   
  35. /** 
  36.  * 获取距离感应器的常量 
  37.  */  
  38. public static final int TYPE_PROXIMITY = 8;  
  39.   
  40. /** 
  41.  * 获取重力感应器的常量 
  42.  */  
  43. public static final int TYPE_GRAVITY = 9;  
  44.   
  45. /** 
  46.  * 获取线性加速度感应器的常量 
  47.  */  
  48. public static final int TYPE_LINEAR_ACCELERATION = 10;  
  49.   
  50. /** 
  51.  * 获取旋转矢量感应器的常量 
  52.  */  
  53. public static final int TYPE_ROTATION_VECTOR = 11;  
  54.   
  55. /** 
  56.  * 获取相对湿度感应器的常量 
  57.  */  
  58. public static final int TYPE_RELATIVE_HUMIDITY = 12;  
  59.   
  60. /** 
  61.  * 获取温度感应器的常量:取缔了public static final int TYPE_TEMPERATURE = 7; 
  62.  */  
  63. public static final int TYPE_AMBIENT_TEMPERATURE = 13;  


Android设备中传感器event值解释


加速度传感器

加速度传感器又叫G-sensor,返回x、y、z三轴的加速度数值。
该数值包含地心引力的影响,单位是m/s^2。
将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认9.81。
将手机朝下放在桌面上,z轴为-9.81。
将手机向左倾斜,x轴为正值。
将手机向右倾斜,x轴为负值。
将手机向上倾斜,y轴为负值。
将手机向下倾斜,y轴为正值。
 

磁力传感器

磁力传感器简称为M-sensor,返回x、y、z三轴的环境磁场数据。
该数值的单位是微特斯拉(micro-Tesla),用uT表示。
单位也可以是高斯(Gauss),1Tesla=10000Gauss。
硬件上一般没有独立的磁力传感器,磁力数据由电子罗盘传感器提供(E-compass)。
电子罗盘传感器同时提供下文的方向传感器数据。
 

方向传感器

方向传感器简称为O-sensor,返回三轴的角度数据,方向数据的单位是角度。
为了得到精确的角度数据,E-compass需要获取G-sensor的数据,
经过计算生产O-sensor数据,否则只能获取水平方向的角度。
方向传感器提供三个数据,分别为azimuth、pitch和roll。
azimuth:方位,返回水平时磁北极和Y轴的夹角,范围为0°至360°。
0°=北,90°=东,180°=南,270°=西。
pitch:x轴和水平面的夹角,范围为-180°至180°。
当z轴向y轴转动时,角度为正值。
roll:y轴和水平面的夹角,由于历史原因,范围为-90°至90°。
当x轴向z轴移动时,角度为正值。
 
电子罗盘在获取正确的数据前需要进行校准,通常可用8字校准法。
8字校准法要求用户使用需要校准的设备在空中做8字晃动,
原则上尽量多的让设备法线方向指向空间的所有8个象限。
 

陀螺仪传感器

陀螺仪传感器叫做Gyro-sensor,返回x、y、z三轴的角速度数据。
角速度的单位是radians/second。
根据Nexus S手机实测:
水平逆时针旋转,Z轴为正。
水平逆时针旋转,z轴为负。
向左旋转,y轴为负。
向右旋转,y轴为正。
向上旋转,x轴为负。
向下旋转,x轴为正。
 

光线感应传感器

光线感应传感器检测实时的光线强度,光强单位是lux,其物理意义是照射到单位面积上的光通量。
光线感应传感器主要用于Android系统的LCD自动亮度功能。
可以根据采样到的光强数值实时调整LCD的亮度。
 

压力传感器

压力传感器返回当前的压强,单位是百帕斯卡hectopascal(hPa)。
 

温度传感器

温度传感器返回当前的温度。
 

距离传感器

又称接近传感器,检测物体与手机的距离,单位是厘米。
一些接近传感器只能返回远和近两个状态,
因此,接近传感器将最大距离返回远状态,小于最大距离返回近状态。
接近传感器可用于接听电话时自动关闭LCD屏幕以节省电量。
一些芯片集成了接近传感器和光线传感器两者功能。


重力传感器

重力传感器简称GV-sensor,输出重力数据。
在地球上,重力数值为9.8,单位是m/s^2。
坐标系统与加速度传感器相同。
当设备复位时,重力传感器的输出与加速度传感器相同。
 

线性加速度传感器

线性加速度传感器简称LA-sensor。
线性加速度传感器是加速度传感器减去重力影响获取的数据。
单位是m/s^2,坐标系统与加速度传感器相同。
加速度传感器、重力传感器和线性加速度传感器的计算公式如下:
加速度 = 重力 + 线性加速度
 

旋转矢量传感器

旋转矢量传感器简称RV-sensor。
旋转矢量代表设备的方向,是一个将坐标轴和角度混合计算得到的数据。
RV-sensor输出三个数据:
x*sin(theta/2)
y*sin(theta/2)
z*sin(theta/2)
sin(theta/2)是RV的数量级。
RV的方向与轴旋转的方向相同。
RV的三个数值,与cos(theta/2)组成一个四元组。
RV的数据没有单位,使用的坐标系与加速度相同。
举例:
sensors_event_t.data[0] = x*sin(theta/2)
sensors_event_t.data[1] = y*sin(theta/2)
sensors_event_t.data[2] = z*sin(theta/2)
sensors_event_t.data[3] =   cos(theta/2)

参考链接:http://my.oschina.net/jerikc/blog/167499

更多相关文章

  1. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  2. android获取NetworkMode
  3. android中的Handler
  4. Android获取GPS坐标:
  5. Android单词查找器
  6. android、sax解析xml
  7. Android(安卓)GPS获取地理位置
  8. Android(安卓)常用的SDCARD和内存操作
  9. android 与其他程序交互(一)

随机推荐

  1. Android(安卓)SDCard Filesystem
  2. android selector 背景选择器
  3. Android中的File文件存储及读取file中的B
  4. android 隐藏API 在源码下编译报错cannot
  5. android sdk中的工具
  6. Android创建隐藏文件或者文件夹
  7. mk中的android:sharedUserId和LOCAL_CERT
  8. Android(安卓)SDK 2.3与Eclipse最新版开
  9. Android(安卓)apk获取系统权限
  10. Android之NDK开发