安卓开发-传感器信息采集

时间:2021-05-11 09:08:03

 

表 1.. Android 平台支持的运动传感器。

参考API 文档:http://developer.android.com/reference/android/hardware/Sensor.html#TYPE_GYROSCOPE

传感器 传感器事件数据 说明 测量单位
TYPE_ACCELEROMETER SensorEvent.values[0] 沿 x 轴的加速度(包括重力)。 m/s2
SensorEvent.values[1] 沿 y 轴的加速度(包括重力)。
SensorEvent.values[2] 沿 z 轴的加速度(包括重力)。
TYPE_GRAVITY SensorEvent.values[0] 沿 x 轴的重力加速度。 m/s2
SensorEvent.values[1] 沿 y 轴的重力加速度。
SensorEvent.values[2] 沿 z 轴的重力加速度。
TYPE_GYROSCOPE SensorEvent.values[0] 围绕 x 轴的旋转角速度。 rad/s
SensorEvent.values[1] 围绕 y 轴的旋转角速度。
SensorEvent.values[2] 围绕 z 轴的旋转角速度。
TYPE_LINEAR_ACCELERATION SensorEvent.values[0]] 沿 x 轴的加速度(不包括重力)。 m/s2
SensorEvent.values[1] 沿 y 轴的加速度(不包括重力)。
SensorEvent.values[2] 沿 z 轴的加速度(不包括重力)。
TYPE_ROTATION_VECTOR SensorEvent.values[0]] 旋转向量沿 x 轴的部分(x * sin(θ/2))。 无无
SensorEvent.values[1] 旋转向量沿 y 轴的部分(y * sin(θ/2))。
SensorEvent.values[2]] 旋转向量沿 z 轴的部分(z * sin(θ/2))。
SensorEvent.values[3]] 旋转向量的数值部分((cos(θ/2))1

 

1 数值部分是可选的。

在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用。 

 1 #define SENSOR_TYPE_ACCELEROMETER       1 //加速度
 2 #define SENSOR_TYPE_MAGNETIC_FIELD      2 //磁力
 3 #define SENSOR_TYPE_ORIENTATION         3 //方向
 4 #define SENSOR_TYPE_GYROSCOPE           4 //陀螺仪
 5 #define SENSOR_TYPE_LIGHT               5 //光线感应
 6 #define SENSOR_TYPE_PRESSURE            6 //压力
 7 #define SENSOR_TYPE_TEMPERATURE         7 //温度
 8 #define SENSOR_TYPE_PROXIMITY           8 //接近
 9 #define SENSOR_TYPE_GRAVITY             9 //重力
10 #define SENSOR_TYPE_LINEAR_ACCELERATION 10//线性加速度
11 #define SENSOR_TYPE_ROTATION_VECTOR     11//旋转矢量

 

图 1. 旋转向量传感器的坐标系。

安卓开发-传感器信息采集

关键类和接口

  1. Sensor
  2. SensorEvent
  3. SensorManager
  4. SensorEventListener

在Android中开发传感器十分简单,只需下面三步:

1、调用Context的getSystemService(Context.SENSOR_SERVICE)方法获得传感器管理服务(SensorManager)。

2、调用SensorManager的getDefaultSensor(int type)方法获取指定类型的传感器。

3、一般在onResume()方法中调用SensorManager的registerListener(SensorEventListener listener,Sensor sensor,int rate)注册监听器.该方法三个参数说明如下:

listener:监听传感器事件的监听器。该监听器需要实现SensorEventListener接口。

sensor:传感器对象。

rate:指定获取传感器数据的频率。支持以下几种频率值:

 

下面演示加速度传感器应用,分别以真机和模拟器两种方式测试,两种方式略有差别。

真机:

Activity:

[java]  view plain copy
 
  1.  1 package com.home;  
     2   
     3 import android.app.Activity;  
     4 import android.content.Context;  
     5 import android.hardware.Sensor;  
     6 import android.hardware.SensorEvent;  
     7 import android.hardware.SensorEventListener;  
     8 import android.hardware.SensorManager;  
     9 import android.os.Bundle;  
    10 import android.widget.TextView;  
    11   
    12 public class AccelerometerActivity extends Activity implements  
    13         SensorEventListener {  
    14     // 定义系统的传感器管理服务  
    15     private SensorManager sensorManager;  
    16     private TextView showText;  
    17   
    18     @Override  
    19     protected void onCreate(Bundle savedInstanceState) {  
    20         super.onCreate(savedInstanceState);  
    21         setContentView(R.layout.main);  
    22         showText = (TextView) findViewById(R.id.main_tv_show);  
    23         // 获取系统的传感器管理服务  
    24         sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);  
    25     }  
    26   
    27     @Override  
    28     protected void onResume() {  
    29         super.onResume();  
    30         // 为系统的加速度传感器注册监听器  
    31         sensorManager.registerListener(this,  
    32                 sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),  
    33                 SensorManager.SENSOR_DELAY_GAME);  
    34     }  
    35   
    36     @Override  
    37     protected void onStop() {  
    38         // 取消注册  
    39         sensorManager.unregisterListener(this);  
    40         super.onStop();  
    41     }  
    42   
    43     // 当传感器精度改变时回调该方法  
    44     @Override  
    45     public void onAccuracyChanged(Sensor sensor, int accuracy) {  
    46     }  
    47   
    48     // 当传感器的值发生改变时回调该方法  
    49     @Override  
    50     public void onSensorChanged(SensorEvent event) {  
    51         if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {  
    52             float[] values = event.values;  
    53             StringBuffer sb = new StringBuffer();  
    54             sb.append("X轴上的加速度:" + values[0] + "\n");  
    55             sb.append("Y轴上的加速度:" + values[1] + "\n");  
    56             sb.append("Z轴上的加速度:" + values[2] + "\n");  
    57             showText.setText(sb.toString());  
    58         }  
    59     }  
    60   
    61 }  

     

布局文件只有一个TextView,在此省略。