安卓开发-传感器信息采集
表 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. 旋转向量传感器的坐标系。
关键类和接口
在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:
-
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,在此省略。