表 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. 旋转向量传感器的坐标系。
关键类和接口
- Sensor
- SensorEvent
- SensorManager
- 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:
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,在此省略。