英文原文:http://developer.android.com/guide/topics/sensors/sensors_position.htmlhtml
版本:Android 4.0 r1 - 08 Mar 2012 0:34android
Android 平臺提供了兩種傳感器來檢測設備的方位:地磁傳感器和方向傳感器。 Android 平臺還提供了一種傳感器,用於檢測屏幕表面與其它物體的鄰近程度,即被稱爲距離傳感器。 地磁傳感器和距離傳感器是基於硬件的。大部分手持和桌面設備都內置了地磁傳感器。手持設備一般還內置了距離傳感器,用於檢測與人臉的靠近程度(好比在通話過程當中)。 而方向傳感器是基於軟件的,它的數據來自加速度傳感器和地磁傳感器。api
方位傳感器用於肯定設備相對地球的物理方位。好比,你能夠用地磁傳感器和加速度傳感器來肯定設備相對北極點的方位。 你還能夠用方向傳感器(或相似的基於傳感器的判斷方向的方法)來肯定設備相對你本身參照系的方位。 方位傳感器一般不會用於監測設備的移動狀況,諸如震動、傾斜、衝擊(詳見 運動傳感器)。數組
地磁傳感器和方向傳感器在 SensorEvent 中返回以多維數組表示的傳感器數據。 好比,方向傳感器在傳感器事件中提供了三個座標軸方向的地磁強度。 同理,方向傳感器還在事件中給出了方位角(側傾度)、俯仰度和翻滾度。 關於傳感器使用的座標系,請參閱 傳感器的座標系。 距離傳感器在事件中給出的是一個值。表 1列出了 Android 平臺支持的全部方位傳感器。框架
表 1. Android 平臺支持的方位傳感器ide
傳感器 | 傳感器事件中的數據 | 說明 | 計量單位 |
---|---|---|---|
TYPE_MAGNETIC_FIELD |
SensorEvent.values[0] |
x 軸的地磁強度 | μT |
SensorEvent.values[1] |
y 軸的地磁強度 | ||
SensorEvent.values[2] |
z 軸的地磁強度 | ||
TYPE_ORIENTATION 1 |
SensorEvent.values[0] |
側傾度(圍繞 z 軸的角度) | 度 |
SensorEvent.values[1] |
俯仰度(圍繞 x 軸的角度) | ||
SensorEvent.values[2] |
翻滾度(圍繞 y 軸的角度) | ||
TYPE_PROXIMITY |
SensorEvent.values[0] |
與物體的距離2 | cm |
方向傳感器用於監測設備相對地球的方位(實際上是地球磁場)。如下代碼展現瞭如何獲取缺省的方向傳感器的一個實例:ui
private SensorManager mSensorManager; private Sensor mSensor; ...mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
方向傳感器的數據來自設備的地磁傳感器和加速度傳感器。利用這兩種硬件傳感器,方向傳感器提供瞭如下三個方向的數據:this
以上定義與航空學上的不一樣,那裏的 X 軸是指飛機的長軸(從機尾至機首)。 而且,因爲歷史的緣由,翻滾度也是以順時針方向爲正(從數學上講,應該是逆時針方向爲正)。spa
方向傳感器的數據是對加速度和地磁傳感器的原始數據進行處理以後再報送出來的。 由於處理工做比較繁重,方向傳感器的精度和準確度會有所下降(只有在翻滾度爲 0 時此傳感器的數據纔是可靠的)。 所以,方向傳感器自 Android 2.2 (API level 8) 開始已通過時了。 做爲直接使用方向傳感器原始數據的替代方案,咱們建議你結合getRotationMatrix() 和 getOrientation() 方法來來計算方向值。你還能夠用 remapCoordinateSystem() 方法來把方向值轉換爲應用程序自定義參照系的座標。code
如下例程展現瞭如何直接向方向傳感器請求方向數據。咱們建議你只在設備翻滾度能夠忽略時才使用這種方式。
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager mSensorManager; private Sensor mOrientation; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView (R.layout.main); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // 執行一些傳感器精度變更後的相關工做 // 必須實現本回調方法的代碼 } @Override protected void onResume() { super.onResume(); mSensorManager .registerListener(this, mOrientation, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); mSensorManager .unregisterListener(this); } @Override public void onSensorChanged(SensorEvent event) { float azimuth_angle = event.values[0]; float pitch_angle = event.values[1]; float roll_angle = event.values[2]; // 利用這些方向角度執行工做 } }
一般你不須要對方向傳感器的數據進行任何處理或過濾,固然以應用程序自定義參照系進行座標轉換除外。Accelerometer Play 範例展現瞭如何把加速度傳感器數據轉換爲其它參照系座標的過程;方向傳感器也能夠採用相似的技術來完成轉換。
地磁傳感器使你能監測地球磁場的變化。如下代碼展現瞭如何獲取缺省的地磁傳感器的一個實例:
private SensorManager mSensorManager; private Sensor mSensor; ...mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
此傳感器提供了三維座標軸方向上的原始的磁場強度數據(單位μT)。一般,你不須要直接使用此傳感器。 取而代之的是,你能夠用旋轉向量傳感器來測量旋轉的原始數據,或者聯合使用加速度計、地磁傳感器、getRotationMatrix() 方法來獲取旋轉矩陣和傾角矩陣。而後,你能夠經過 a href="http://developer.android.com/reference/android/hardware/SensorManager.html#getOrientation(float[], float[])">getOrientation() 和 getInclination() 根據這些矩陣數據獲得側傾度和地磁傾角數據。
距離傳感器使你能檢測設備距離某物體的遠近程度。如下代碼展現瞭如何獲取缺省的距離傳感器的一個實例:
private SensorManager mSensorManager; private Sensor mSensor; ...mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
距離傳感器一般用於肯定用戶頭部與手持設備屏幕表面的距離(好比,用戶撥打或接聽電話時)。 大部分距離傳感器返回的是絕對距離,單位是 cm,但某些傳感器只能返回遠近程度值。 如下代碼展現了距離傳感器的使用:
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager mSensorManager; private Sensor mProximity; @Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView (R.layout.main); // 獲取傳感器設備的一個實例,並用它獲取某個特定的傳感器 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // 在這裏進行一些傳感器精度改變後的處理 } @Override public final void onSensorChanged(SensorEvent event) { float distance = event.values[0]; // 處理當前的傳感器數據 } @Override protected void onResume() { // 註冊一個傳感器偵聽器 super.onResume(); mSensorManager .registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { // 請在 activity 暫停時確保註銷傳感器 super.onPause(); mSensorManager .unregisterListener(this); } }