动作传感器概述
Android平台支持一些用于监视设备动作的传感器(这样的传感器共有5个)。其中两个(加速传感器和陀螺仪传感器)是纯的硬件传感器。另外三个(重力传感器、线性加速传感器和旋转向量传感器)可能是硬件传感器,也可能是软件传感器。例如,在一些Android设备中,这些基于软件的传感器会从加速和磁力传感器中获取数据,但在另一些Android设备中也可能从陀螺仪传感器中获取数据。也就是说,同一种基于软件的传感器在不同的Android设备中回传的数据可能来自不同的硬件传感器。所以基于软件的同一种传感器在不同的设备中可能精确度、使用范围有所不同。大多数高端Android设备都会有加速传感器,还有一些拥有陀螺仪传感器。
动作传感器的作用
动作传感器对于监测设备的移动非常有用,例如,倾斜、震动、旋转和摆动都属于动作传感器的监测范围。设备的移动通常是对用户输入的直接反应。例如,用户正在游戏中飙车,或控制游戏中的一个小球)。除此之外,设备所处的物理环境也会反应在设备的动作上,例如,用户正常驾驶汽车,而这是Android设备正安静地躺在旁边的座椅上,尽管设备没有移动,但会随着车的行驶而不断震动,而且设备也会随着汽车的移动而移动。
对于第一种情况,可以对设备本身的相对位置进行监测。而对于第二种情况,需要考虑到设备以外的参照系。动作传感器本身一般并不会用于监测设备的位置,关于设备的位置需要用其他类型的传感器进行监测,例如,磁场传感器。
动作传感器的回传数据
所有的动作传感器都会返回三个浮点数的值(通过长度为3的数组返回),但对于不同的传感器,这三个只的意义不同。例如,对于加速传感器,会返回三个坐标轴的数据。对于陀螺仪传感器,会返回三个坐标轴的旋转角速度。
加速传感器
# 设备从左到右推动,X轴加速度为正值。
# 设备朝着自己推动,Y轴加速度为正值。
# 如果朝着天空以A m/s^2的加速度推动,那么Z轴的加速度为A + 9.81,所以如果计算实际的加速度(抵消重力加速
度),需要减9.81。
Demo
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/tvAccelerometer" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/tvMagentic" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/tvLight" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" /> <TextView android:id="@+id/tvOrientation" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" /> <TextView android:id="@+id/tvSensors" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" /> </LinearLayout>
1 package cn.eoe.motion.sensor; 2 3 import android.app.Activity; 4 import android.hardware.Sensor; 5 import android.hardware.SensorEvent; 6 import android.hardware.SensorEventListener; 7 import android.hardware.SensorManager; 8 import android.os.Bundle; 9 import android.util.Log; 10 import android.widget.TextView; 11 12 public class MotionSensorActivity extends Activity implements 13 SensorEventListener { 14 15 private TextView tvAccelerometer; 16 private SensorManager mSensorManager; 17 private float[] gravity = new float[3]; 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_motion_sensor); 23 24 tvAccelerometer = (TextView) findViewById(R.id.tvAccelerometer); 25 26 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 27 28 } 29 30 @Override 31 public void onAccuracyChanged(Sensor sensor, int accuracy) { 32 33 } 34 35 @Override 36 public void onSensorChanged(SensorEvent event) { 37 switch (event.sensor.getType()) { 38 case Sensor.TYPE_ACCELEROMETER: // 加速度传感器 39 final float alpha = (float) 0.8; 40 /** 41 * event.values[0] 沿X轴加速度。 42 * event.values[1] 沿Y轴加速度。 43 * event.values[2] 沿Z轴加速度。 44 * gravity 处理重力加速度的杂音(不能能百分之百去掉)。 45 */ 46 gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 47 gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 48 gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; 49 50 String accelerometer = "\n" + "X:" 51 + (event.values[0] - gravity[0]) + "\n" + "Y:" 52 + (event.values[1] - gravity[1]) + "\n" + "Z:" 53 + (event.values[2] - gravity[2]); 54 Log.d("z", String.valueOf(event.values[2] - gravity[2])); 55 tvAccelerometer.setText(accelerometer); 56 57 // 9.81m/s^2 58 break; 59 case Sensor.TYPE_GRAVITY: // 重力传感器 60 gravity[0] = event.values[0]; 61 gravity[1] = event.values[1]; 62 gravity[2] = event.values[2]; 63 break; 64 case Sensor.TYPE_PROXIMITY: // 临近传感器 65 setTitle(String.valueOf(event.values[0])); 66 break; 67 default: 68 break; 69 } 70 71 } 72 73 protected void onResume() { 74 super.onResume(); 75 /** 76 * 注册传感器 77 * 78 * 第二个参数,所注册的传感器。 79 * 第三个参数,采样频率数值。SENSOR_DELAY_FASTEST:最快的。 80 */ 81 mSensorManager.registerListener(this, 82 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 83 SensorManager.SENSOR_DELAY_UI); // 加速度 84 mSensorManager.registerListener(this, 85 mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY), 86 SensorManager.SENSOR_DELAY_FASTEST); // 重力传感器 87 mSensorManager.registerListener(this, 88 mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY), 89 SensorManager.SENSOR_DELAY_UI); // 90 } 91 92 @Override 93 protected void onPause() { 94 super.onPause(); 95 // 卸载所有传感器 96 mSensorManager.unregisterListener(this); 97 98 } 99 100 }
2. 传感器:动作传感器