標籤:
表 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:
[java] view plaincopy
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,在此省略。
安卓開發-感應器資訊採集