Android傳感器概述(八)

傳感器的坐標系統

通常情況,傳感器框架使用標準的3軸坐標系統來表達數據值。對於大多數傳感器,坐標系統是相對與設備被保持在默認方向時的設備的屏幕來定義的(如圖1)。當設備被保持在默認方向時,X軸是水平向右、Y軸是垂直向上、Z軸是指向屏幕面板的外部。在這個系統中,背對著屏幕的Z軸坐標是負值。該坐標系統被下列傳感器使用:

1.加速度傳感器    

2.重力傳感器

3.陀螺儀

4.線性加速傳感器

5.磁力儀

  

圖1.傳感器API使用的坐標系統。

要理解的最重要的一點是,在設備屏幕的方向發生變化時,坐標系統的各坐標軸不會發生變化,也就是說傳感器的坐標系統不會因設備的移動而改變。這種行為與OpenGL坐標系統的行為相同。

另外要理解的一點是,應用程序不要假設設備的自然(默認)方向是縱向的。對於很多平板設備的自然方向是橫向的。傳感器坐標系統總基於設備的自然方向。

最後,如果你的應用程序要把傳感器的數據跟屏幕上的顯示相匹配,那麼就要使用getRotation()方法來判斷屏幕的旋轉性,然後使用remapCoordinateSystem()方法把傳感器坐標映射到屏幕的坐標上。即使在你的清單中指定瞭隻是縱向顯示,你也要這麼做。

註意:有些傳感器和方法使用的坐標系統是相對與全球參照系(不是設備參照系)。這些傳感器和方法返回的數據是相對與地球的設備運動或設備位置。

 

訪問和使用傳感器的最佳實踐

在你設計你的傳感器實現時,要確保遵循以下討論指南。這些指南是被推薦的使用傳感器框架訪問傳感器和獲取傳感器數據的最佳實踐。 www.aiwalls.com

註銷傳感器監聽器

在使用完成傳感器或傳感器的Activity被掛起時,要確保註銷傳感器的監聽器。如果被註冊的傳感器監聽器和它的Activity被掛起,那麼傳感器還會繼續獲取數據,並消耗電池資源直到註銷傳感器。下列代碼顯示如何使用onPause()方法來註銷監聽器:

private SensorManager mSensorManager;

  …

@Override

protected void onPause() {

  super.onPause();

  mSensorManager.unregisterListener(this);

}

不要在模擬器上測試

因為模擬器不能夠模擬傳感器,所以目前還不能在模擬器上測試傳感器代碼。你必須在物理設備上測試你的傳感器代碼。但是傳感器模擬器能夠模擬傳感器的輸出。

不要阻塞onSensorChanged()方法

傳感器數據能夠高頻率的變化,這意味著系統會非常頻繁的調用onSensorChanged(SensorEvent)方法。作為最佳實踐,在onSensorChanged(SensorEvent)方法中應該盡可能的少做事,以便不阻塞這個方法。如果應用程序需要進行數據過濾或減少傳感器數據,應該在onSensorChanged(SensorEvent)方法外來執行。

避免使用廢棄的方法或傳感器類型

有幾個方法和常量已經被廢棄,尤其是TYPE_ORIENTATION傳感器類型已經被廢棄。應該使用getOrientation()方法來獲取方向數據。同樣,TYPE_TEMPERATURE傳感器類型也已經被廢棄瞭。在運行Android4.0的設備上應用使用TYPE_AMBIENT_TEMPERATURE傳感器類型來替代。

在使用之前要確認傳感器

在嘗試從傳感器上獲取數據之前,要始終確認你所使用的傳感器在設備上是否存在。不能因為是經常使用的傳感器就簡單的假設傳感器是存在的。不要求設備制造商在他們的設備上提供任何特定的傳感器。

仔細選擇傳感器的延遲

用registerListener()方法註冊傳感器時,一定要選擇一個適應應用程序或應用場景的發送頻率。傳感器能夠以很高的頻率來提供數據。允許系統在不浪費系統資源和不使用電池供電的情況下發送額外的數據。

 

 

You May Also Like