Android 傳感器概述

Android官方文檔

大多數Android設備都內置有測量運動,方向和各種環境情況的傳感器,這些傳感器能夠提供多種高精度的原始數據。如果你想監控三維的設備運動或位置,或者是監控周圍環境的變化,這些數據都是非常有用的。舉個例子,我們玩一款遊戲,它可能需要讀取中立傳感器的數據,以便去推斷我們複雜的姿勢和動作,像傾斜,振動,旋轉或者振幅等情況。同樣地,一款天氣應用程序,可能需要用到設備的溫度和溼度傳感器,通過它們的數據去計算“結露點”。再者,一款旅行的應用軟件可能需要使用磁感應和加速度傳感器來計算羅盤的指針情況。

Android平臺支持三大類傳感器:

  • 位移傳感器
    這些傳感器沿三條軸線測量加速度和旋轉力度。這類傳感器家族包括加速度傳感器,重力傳感器,陀螺儀和旋轉適量傳感器。
  • 環境傳感器
    測量各種環境參數的傳感器,如,周圍的氣溫和氣壓,光線強度和溼度。這類傳感器有氣壓,光線和溫度傳感器。
  • 位置傳感器
    這些傳感器測量設備的物理位置,其包含方向和磁力傳感器。

你可以通過使用Android Framework暴漏的API,訪問設備上可用傳感器的原始數據。Sensor Framework提供了一系列類和接口來幫助你執行各種Sensor相關的工作,例如,我們能夠使用sensor framework做 如下一系列工作:

  • 確定設備上哪些傳感器可供使用。
  • 確定單個傳感器的能力,如最大的工作範圍,廠商信息,功率和分辨率。
  • 獲取原始的sensor數據,並且你也可以定義所要獲取的sensor數據的最小頻率。
  • 註冊和註銷監聽sensor事件變化的listener。

    該主題提供了在Android平臺上傳感器的概況,同時也介紹sensor framework的情況。

傳感器介紹


Android sensor framewrok允許你訪問多種類型的傳感器,這些傳感器有的基於硬件,有一些是基於軟件的。基於硬件的傳感器是內嵌到手機或者平板中的物理器件,它們的數據直接來源於測量特定的物理特性,如加速度,地球磁場強度,或角速度的變化。基於軟件的傳感器沒有物理元器件,它們是模仿基於硬件的傳感器工作的。基於軟件的傳感器從一個或更多的基於硬件的傳感器中獲取數據。有時候它們也被稱爲虛擬傳感器或合成傳感器,線性加速度傳感器和重力傳感器就是基於軟件傳感器的例子。表1總結了Android平臺支持的傳感器。

一般的Android都不支持所有類型的傳感器。例如,大部分手機和平板都有一個加速傳感器和磁力傳感器,但是很少有擁有氣壓傳感器或者溫度傳感器。並且,一個設備可以擁有一種類型的不止一個的傳感器,如,一個設備擁有兩個重力傳感器,每個傳感器有不同的測量範圍。

Table 1. Sensor types supported by the Android platform.
表1. Android平臺支持的傳感器類型

傳感器 類型 描述 常見用法
TYPE_ACCELEROMETER 硬件 以m/s2 爲單位測量三個軸向的(x,y,和z)加速度,包括重力。 運動檢測(震動,傾角等)。
TYPE_AMBIENT_TEMPERATURE 硬件 以攝氏度爲單位測量周圍空間的溫度,參閱下面的註釋。 檢測空氣溫度。
TYPE_GRAVITY 軟件/硬件 以m/s2 爲單位測量三個軸向的(x,y,和z)的重力。 運動檢測(震動,傾角等)。
TYPE_GYROSCOPE 硬件 以rad/s爲單位測量設備三個物理軸線方向(x,y,和z)的旋轉速度。 檢測旋轉(旋轉,翻轉等等)。
TYPE_LIGHT 硬件 以lx爲單位測量周圍的光線級別(光照度)。 控制屏幕亮度。
TYPE_LINEAR_ACCELERATION 軟件或硬件 以m/s2 爲單位測量三個軸向的(x,y,和z)的加速度,不包括重力。 檢測單個軸線的加速度。
TYPE_MAGNETIC_FIELD 硬件 以 μT爲單位測量周圍三個物理軸向(x, y, z)的磁場。 創建一個羅盤。
TYPE_ORIENTATION 軟件 測量設備所有三個物理軸向(x,y和x)的旋轉角度。當使用Level 3的API的時候,你能通過使用重力傳感器和磁場傳感器,結合getRotatinMatrix()方法,獲取設備的傾斜矩陣和旋轉矩陣。 檢測設備的位置。
TYPE_PRESSURE 硬件 以hPa或mbar爲單位測量周圍的氣壓。 檢測氣壓的變化。
TYPE_PROXIMITY 硬件 以cm爲單位測量一個物體相對於設備屏幕的臨近程度,這種傳感器的典型用例是檢測是否手機被放到人的耳旁。 檢測通話過程中手機的位置。
TYPE_RELATIVE_HUMIDITY 硬件 以百分比(%)爲單位測量周圍的相對溼度。 檢測結露點,絕對和相對溼度。
TYPE_ROTATION_VECTOR 軟件或硬件 通過提供設備的三個旋轉矢量測量設備方向。 Motion detection and rotation detection.
TYPE_TEMPERATURE 硬件 以攝氏度爲單位測量設備的溫度。這個傳感器在不同設備實現不同,並且這其在API Level 14中被TYPE_AMBIENT_TEMPERATURE替代。 檢測溫度。

Sensor Framework

通過Android sensor framework,你能訪問這些傳感器並獲取它們的原始數據。sensor framework是android.hardware包的一部分,包含下面的一些類和接口:

  • SensorManager
    你能使用這個類來創建傳感器服務的實例。這個類提供了各種方法類訪問和列舉傳感器,註冊和註銷傳感器的事件監聽,獲取相應的信息。這個類也提供了一些傳感器的常量:報告傳感器的精確度,設置數據獲取頻率,和校準傳感器。
  • Sensor
    通過這個類能夠創建一個特定傳感器的視力,這個類提過了各種檢測傳感器能力的方法。
  • SensorEvent
    系統使用這個類來創建一個傳感器的事件對象,它提供傳感器事件的信息。傳感器事件包含以下信息:原始傳感器數據,產生這個事件的傳感器類型,數據的準確性,以及事件的時間戳。

在一個典型的應用程序中,使用這些傳感器相關的API執行兩個基本的任務:

  • 識別傳感器及其性能

如果你的應用程序有功能依賴特定類型的傳感器及其功能,在運行時識別傳感器及其功能是非常有用的。例如,你可能想識別設備上可用的所有傳感器,和禁用所有依賴不存在的傳感器的應用程序功能。同樣,你可能想識別一個指定類型的所有傳感器,以便你能選擇某個傳感器爲你的應用程序實現最佳的性能。

  • 檢測傳感器事件
    獲得原始傳感器數據的方法是檢測傳感器事件。每當傳感器檢測到被測量的參數變化時,它就會上報傳感器事件,傳感器事件提過了4方面的信息:觸發這個時間的傳感器名稱,觸發時間的時間戳,事件的精準度,和觸發事件的原始傳感器數據。

傳感器的可用性

傳感器的可用性隨着設備的不同而不同,也隨着Android不同的版本而變化。這是因爲Android的傳感器歷經幾個平臺版本逐步引入的。例如,一些傳感器在Android1.5(API Level 3)中被引入,但是一些直到Android2.3(API Level 9)也沒有被實現。同樣的,多個傳感器在Android2.3(API Level 9)和Anroid4.0(API Level 14)被引入。兩個傳感器被棄用,被更新的,更好的替代。

表2概括了每個傳感器在每個平臺的可用性。僅有四個平臺被列出,這是因爲傳感器在這幾個平臺中發生了變化。列出的棄用傳感器仍可在後續的平臺使用(設備上存在這些傳感器),這符合Android向前兼容的策略。

表2.傳感器平臺的可用性

Sensor Sensor Android 4.0 (API Level 14) Android 2.3 (API Level 9) Android 2.2 (API Level 8) Android 1.5 (API Level 3)
TYPE_ACCELEROMETER Yes Yes Yes Yes
TYPE_AMBIENT_TEMPERATURE Yes n/a n/a n/a
TYPE_GRAVITY Yes Yes n/a n/a
TYPE_GYROSCOPE Yes Yes n/a1 n/a1
TYPE_LIGHT Yes Yes Yes Yes
TYPE_LINEAR_ACCELERATION Yes Yes n/a n/a
TYPE_MAGNETIC_FIELD Yes Yes Yes Yes
TYPE_ORIENTATION Yes2 Yes2 Yes2 Yes
TYPE_PRESSURE Yes Yes n/a1 n/a1
TYPE_PROXIMITY Yes Yes Yes Yes
TYPE_RELATIVE_HUMIDITY Yes n/a n/a n/a
TYPE_ROTATION_VECTOR Yes Yes n/a n/a
TYPE_TEMPERATURE Yes2 Yes Yes Yes

1 這個類型的傳感器在Android1.5(API Level 3)被添加,但是直到Android2.3(API Level 9)也不可用。
2 這個傳感器是可用的,但是被棄用。

識別傳感器及其性能


Android sensor framework提供了許多方法,它使你的運行時確定設備上有哪些傳感器變得很容易。這個API也提供讓你確定傳感器的性能的方法,例如它的最大範圍,它的分辨率,和它的功率要求。

爲了識別在設備上的傳感器,你首先需要獲取傳感器服務的引用。爲此,需要通過調用getSystemService()方法並傳遞SENSOR_SERVICE參數,創建SensorManager類的一個實例。例如:

private SensorManager mSensorManager;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

接下來,通過調用getSensorList()方法,並使用TYPE_ALL常量獲取設備上所有傳感器列表。例如:

List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);

如果你想列出一個特定類型的所有傳感器,應該使用其它的常量替代TYPE_ALL,例如TYPE_GYROSCOPE,TYPE_LINEAR_ACCELERATION,或者TYPE_GRAVITY。

你也可以通過調用getDefaultSensor()方法並傳遞指定傳感器的類型常量,來確定該傳感器是否在設備上存在。如果設備上有超過一個指定類型的傳感器,其中一個傳感器必須被指定爲默認的傳感器。如果一個指定類型的默認傳感器不存在,這個方法返回null,這意味着設備沒有這個類型的傳感器。例如,下面的代碼用來檢測在設備上是否有一個磁力傳感器。

private SensorManager mSensorManager;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
if (mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){
  // Success! There's a magnetometer.
}
else {
  // Failure! No magnetometer.
}

注意: Android沒有要求設備製造商向它們的Android設備內嵌某個類型的傳感器,所以設備會有一個廣泛的傳感器配置範圍。

除了列出設備上的傳感器之外,你能使用Sensor類的公共方法來檢測某個傳感器的性能和屬性,如果你想讓你的應用程序,基於設備上可用的不同的傳感器或者不同的傳感器性能,表現出不同的行爲,這將是非常有用的。例如,你可以使用getResolution()和getMaximumRange()方法獲取傳感器的測量的分辨率和最大範圍,你也能使用getPower()方法類獲取傳感器的功率需求。

如果你想針對不同廠商或者不同版本的傳感器來優化你的應用程序,有兩個公共方法是非常有用的。例如,如果你的應用程序需要檢測用戶的手勢,例如傾斜和晃動,你能夠創建一個數據過濾規則集合,針對較新的有指定廠商的重力傳感器的設備進行優化。創建其它的數據過濾規則,針對沒有重力傳感器但僅有一個加速度傳感器的設備進行優化。下面的代碼片段展示瞭如何通過使用getVendor()和getVersion()方法來這樣做。在這個例子中,我們查找一個Google Inc廠商並且其版本號爲3的重力傳感器。如果指定的傳感器在設備上不存在,我們嘗試使用加速度傳感器。

private SensorManager mSensorManager;
private Sensor mSensor;

...

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = null;

if (mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null){
  List<Sensor> gravSensors = mSensorManager.getSensorList(Sensor.TYPE_GRAVITY);
  for(int i=0; i<gravSensors.size(); i++) {
    if ((gravSensors.get(i).getVendor().contains("Google Inc.")) &&
       (gravSensors.get(i).getVersion() == 3)){
      // Use the version 3 gravity sensor.
      mSensor = gravSensors.get(i);
    }
  }
}
if (mSensor == null){
  // Use the accelerometer.
  if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){
    mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
  }
  else{
    // Sorry, there are no accelerometers on your device.
    // You can't play this game.
  }
}

另一個有用的方法是getMinDelay(),它返回傳感器採集數據的最小時間間隔(微秒)。getMinDelay()方法返回非零值的傳感器是流式傳感器。流式傳感器以規律的時間間隔採集數據,其在Andriod2.3(API Level 9)中被引入。如果調用getMinDelay()方法時傳感器返回0,它意味着這個傳感器不是一個流式傳感器,因爲它僅當感應的參數改變的時候才報告數據。

getMinDelay()方法是非常有用的,因爲它讓你確定了傳感器獲取數據最大的速率。如果在你應用程序中的某一個功能需要高數據採集率或者一個流式傳感器,你能使用這個方法類確定是否這個傳感器滿足這些要求,然後啓動或禁止相關功能。

注意:傳感器的最大數據採集率並不一定是sensor framework傳給應用程序數據的速率。sensor framework通過傳感器事件上報數據,有多種因素會影響應用程序獲取傳感器事件的速率。更多信息查閱監測傳感器事件。

監測傳感器事件


爲了監測原始數據,需要實現兩個通過SensorEventListener接口暴漏的回調方法: onAccuracyChanged()和onSensorChanged(),當下面的事情發生時,Android系統會調用這兩個回調函數:

  • 傳感器精度變化
    在這種情況下系統會調用onAccuracyChanged()方法,向你提供改變了新的傳感器精度的Sensor對象引用。精度通過四個狀態常量代表: SENSOR_STATUS_ACCURACY_LOW, SENSOR_STATUS_ACCURACY_MEDIUM, SENSOR_STATUS_ACCURACY_HIGH, or SENSOR_STATUS_UNRELIABLE.
  • 傳感器上報新值
    這種情況下,系統調用onSensorChanged()方法,傳遞一個SensorEvent對象給你,該SensorEvent對象中包含了新的sensor數據的信息:數據的精度,sensor採集到的數據,數據生成時的時間戳以及新採集的數據記錄。

下面的代碼展示瞭如何通過使用onSensorChanged()方法來監控光線傳感器的數據。這個例子在一個在main.xml文件中以sensor_data被定義的TextView中,用來顯示了原始的數據。

public class SensorActivity extends Activity implements SensorEventListener {
  private SensorManager mSensorManager;
  private Sensor mLight;

  @Override
  public final void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
  }

  @Override
  public final void onAccuracyChanged(Sensor sensor, int accuracy) {
    // Do something here if sensor accuracy changes.
  }

  @Override
  public final void onSensorChanged(SensorEvent event) {
    // The light sensor returns a single value.
    // Many sensors return 3 values, one for each axis.
    float lux = event.values[0];
    // Do something with this sensor value.
  }

  @Override
  protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
  }

  @Override
  protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(this);
  }
}

在這個例子中,當調用registerListener()方法時,指定其默認的數據延遲(SENSOR_DELAY_NORMAL)。數據延遲(或採樣率)控制着通過onSensorChanged()回調方法向你的應用程序發送傳感器事件的時間間隔。默認的數據間隔適合檢測典型的屏幕方向改變,其值爲200, 000微秒。你能指定其它的數據延遲,如SENSOR_DELAY_GAME(20, 000微秒延遲),SENSOR_DELAY_UI(60, 000微秒延遲),或者SENSOR_DELAY_FASTEST(0微秒延遲)。在Android3.0(API Level 11)中你也可以指定一個絕對的數值(以微秒)。

你指定的延遲僅僅是一個建議延遲。Android系統和其它應用系統以後可以改變這個延遲。最好的方法,你應該指定一個你能接受的最大的延遲,因爲系統通常會使用一個比你指定的小的延遲(也就是說你應該選擇一個滿足你應用程序需要的最慢的採樣率)。使用更大的延遲會 使處理器有更小的負載,因此有更低的能耗。

沒有公共的方法來去決定sensor framework向你的應用程序發送傳感器事件的速率;然而,你可以通過幾個上報給你的事件的時間戳計算出採樣率。一旦設置了採樣率,就不能再改變採樣率(延遲)。如果由於一些原因,你必須改變這個延遲,你將不得不註銷並重新註冊傳感器的listener。

同樣重要的是要注意這個例子中,使用onResume()和onPause()回調方法來註冊和註銷傳感器事件的listener。最爲一項最好實踐,你應該總是在你不需要的時候禁用傳感器,尤其是當你的Activity被Pause的時候。如果沒有這樣做,可能會導致在短短几個小時之內耗盡電池,因爲一些傳感器有很大的功率要求,並且會很快耗完電池。當屏幕關閉的時候系統不會會自動禁用傳感器。

處理不同的傳感器配置

Android沒有爲設備指定一個標準的傳感器配置,這意味着設備廠商可以將任何它們想要的傳感器配置安裝到他們的的Android設備。結果,多種範圍的傳感器可能會被內置到設備中。例如,Motorola Xoom有一個壓力傳感器,但是Samsung Nexus S沒有這個傳感器。同樣,Xoom和Nexus S有陀螺儀傳感器,但是HTC 的Nexus One則沒有。如果你的應用程序依賴於特定類型的傳感器,你必須確保這個傳感器在設備上存在,從而能讓你的應用程序成功運行。你有兩個選擇來確保特定的傳感器在設備上存在:

  • 在運行時檢測傳感器,並根據情況啓動或禁用應用程序的相應功能。
  • 使用Google Play過濾有相應傳感器配置的目標設備。

下面的章節將分別討論每一個選項。

運行時檢測傳感器

如果你的應用程序使用一個特定類型的傳感器,但是不依賴它,你能使用sensor framework在運行時檢測傳感器,然後酌情禁用和啓動應用程序功能。例如,一個導航引用程序可能使用溫度傳感器,壓力傳感器,GPS傳感器,和磁場傳感器來顯示溫度,氣壓,位置和羅盤方位。如果設備沒有一個壓力傳感器,你能使用sensor framework在運行時檢查壓力傳感器是否存在,然後就可以在你的應用程序不顯示壓力的UI部分。例如,下面的代碼檢查設備上是否有一個壓力傳感器:

  private SensorManager mSensorManager;
  ...
  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
  if (mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null){
  // Success! There's a pressure sensor.
  }
  else {
  // Failure! No pressure sensor.
  }

使用Google Play過濾特定的傳感器配置的設備

在Google Play中發佈你的應用程序,如果你能在你的manifest文件中使用 <uses-feature> 元素來過濾掉那些沒有你的應用程序需要的傳感器配置的設備。<uses-feature>元素有多個硬件描述符,讓你基於是否存在指定的傳感器來過濾掉應用程序。能夠列舉的傳感器包括:加速度,氣壓,羅盤(磁場),陀螺儀,光線,和距離傳感器。下面是一個manifest的示,用來過濾沒有加速度傳感器的應用程序。

<uses-feature android:name="android.hardware.sensor.accelerometer"
              android:required="true" />

如果需要向你的manifest文件中添加這個元素和描述符,只有當他們的設備有加速度傳感器時才能在Google Play中看到你的應用程序。

只有當你的應用程序完全依賴一個特定的傳感器的時候,你才應該設置這個android:required=”true”這個描述符。如果你的應用程序的一些功能使用這樣一個傳感器,但是沒有這個傳感器時仍然可以運行,你應該在元素中列出這個傳感器,但是設置這個描述符爲android:required=”false”。這將幫助確保設備能安裝你的應用,即使它們沒有這個特定的傳感器。這也是一個項目管理的最佳實踐,它能夠幫組你跟蹤你的應用程序使用的特性。記住,如果你的應用程序使用一個特定的傳感器,但是沒有它仍然可以運行,那麼你應該在運行時檢測這個傳感器,並且酌情啓動或禁用應用程序的某些功能。

傳感器座標系


通常情況下,sensor framework使用一個標準的3維座標系來表達數據值,對於大多數傳感器來說,當設備放置在默認的方向(圖1所示)的時候,座標系和設備的屏幕相關。當設備放置爲它默認的方向,X軸是水平的並指向右邊,Y軸是豎直並指向上方,並且Z軸指向屏幕面的外側。在這個座標系統,屏幕下方的座標有負的Z值。這個座標系被用於下面的傳感器:

這裏寫圖片描述
圖1. 傳感器AIP使用的座標系統(相對於設備)

  • 加速度傳感器
  • 重力傳感器
  • 陀螺儀傳感器
  • 線性加速度傳感器
  • 地磁場傳感器

理解這個座標表系的最重要的一點是,當設備屏幕的方向改變的時候,軸不改變—換句話說,傳感器的座標系不會隨着當設備移動的而改變,這和OpenGL座標系是相同的。

理解的另一點是你的應用程序不能假定設備的自然(默認)方向是豎屏。對於許多平板設備來說,他們的自然方向是橫屏,並且傳感器的座標系總是基於設備的自然方向。

最後,如果你的應用程序匹配傳感器數據要顯示到屏幕上,你需要使用getRotation()方法來確定屏幕的旋轉,然後使用remapCoordinateSystem()方法來映射傳感器座標系到屏幕座標系。即使你的manifest文件指定了僅僅豎屏幕顯示,你也需要這樣做。
For more information about the sensor coordinate system, including information about how to handle screen rotations, see One Screen Turn Deserves Another.
更多關於傳感器座標系的信息,包含如何處理屏幕旋轉的信息,查閱 One Screen Turn Deserves Another

注意:一些傳感器和方法使用的座標系是相對於真實世界的參照(相對於設備的參考框架)。這些傳感器和方法返回數據代表設備的運動或者設備相對於地球的位置。更多信息,查閱getOrientation()方法,getRotationMatrix()方法,Orientation Sensor,和Rotation Vector Sensor

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


當你設計你的傳感器實現的時候,確保遵守這個章節下面討論的準則。這些準則是爲任何使用sensor framework訪問並獲取傳感器數據的最佳實踐。

註銷傳感器的listeners

當使用完成傳感器或者當傳感器activity pause的時候,確保註銷傳感器listener。如果一個傳感器的listener被註冊並且它的activity被pause,這個傳感器將繼續獲取數據並且使用電池資源,除非你註銷這個傳感器。下面的代碼展示瞭如何使用onPause()方法來註銷一個listener:

private SensorManager mSensorManager;
  ...
@Override
protected void onPause() {
  super.onPause();
  mSensorManager.unregisterListener(this);
}

更多的信息,請參閱 unregisterListener(SensorEventListener)

不要在模擬器上測試你的代碼

你目前不能在模擬器上測試你的傳感器代碼,因爲模擬器不能模擬傳感器。你必須在一個物理設備上測試你的傳感器代碼。然而,有能夠用來模擬傳感器輸出的傳感器模擬器。

不要block onSensorChanged()方法

傳感器數據可以高速的變化,這意味着系統可能經常調用onSensorChanged(SensorEvent)方法。作爲最佳的實踐,你應該竟儘可能少的在onSensorChanged(SensorEvent)方法中做事情,以便不去block這個回調。如果你的應用程序要求你做任何數據過濾或者減少傳感器數據,你應該在onSensorChanged(SensorEvent)方法外執行這個工作。

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

一些方法和常量已經被棄用。尤其,TYPE_ORIENTATION類型的傳感器已經被棄用。爲了獲取方向數據你應該使用getOrientation()方法來替代。同樣,TYPE_TEMPERATURE傳感器類型也已經被棄用,你應該在運行Andorid4.0的設備上使用TYPE_AMBIENT_TEMPERATURE傳感器類型替代。

使用前驗證傳感器

在你嘗試從傳感器獲取數據之前,總是驗證設備上是否存在這個傳感器。不要因爲它是一個常用的傳感器而簡單假設傳感器存在。設備廠商沒有被要求在它們的設備上提供任何指定的傳感器。

仔細選擇傳感器延遲時間

當你使用registerListener()方法中註冊一個傳感器的時候,確保你選擇一個適合你的應用程序或者用例的採集速率。傳感器能高速地提供數據。允許系統發送額外的你不需要的數據,浪費系統資源並消耗電池電量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章