Android 傳感器 I-傳感器基本介紹

概述:

大多數Android設備都有內置的傳感器用來測量運動, 方向和多種環境狀況. 這些傳感器可以提供高精度的原始數據, 如果我們想要監測三維設備移動或者位置或者想要監測環境改變的話, 它們都很有用. 慄如, 有些遊戲可以通過重力傳感器實現用戶複雜的手勢和運動, 搖晃旋轉擺動等. 還有比如一個天氣應用可能使用設備的溫度傳感器和溼度傳感器來計算和報告環境參數, 或者旅遊APP可能使用地磁傳感器和加速計來報告指南針方位.

Android平臺支持三類傳感器:

l  運動傳感器: 這類傳感器用三個獨立的軸測量加速度和旋轉力. 這類包含加速度計, 重力傳感器, 陀螺儀和旋轉矢量傳感器.

l  環境傳感器: 這類傳感器測量多種環境參數比如環境空氣溫度和壓力, 照明和溼度. 包括氣壓計, 光度計和溫度計.

l  位置傳感器: 這類傳感器測量設備的物理位置. 包括方向傳感器和磁力計.

我們可以訪問設備上可用的傳感器並通過Android sensor framework來獲取原始的傳感器數據. Sensorframework提供了很多類和接口讓我們可以實現大量的傳感器相關的任務. 比如我們可以使用sensor framework做這些事:

l  確定設備上哪些傳感器可用.

l  確定一個單獨的傳感器的能力,比如它的最大範圍, 供應商, 電源要求和分辨率.

l  獲取傳感器原始數據並定義獲取原始數據的頻率.

l  註冊和註銷傳感器時間監聽器.

本文介紹了Android平臺上基本傳感器的介紹, 也介紹了sensor framework.

傳感器基本介紹:

Android sensor framework讓我們可以訪問多種傳感器.有些是基於硬件的有些是基於軟件的. 硬件實現的傳感器是設備內部的物理組件. 它們直接測量指定的環境屬性來獲取數據, 比如加速度, 磁場強度或者角度變化. 軟件實現的傳感器並不是物理設備, 雖然它們看起來在模擬物理傳感器. 軟件傳感器從一個或者多個硬件傳感器中獲得數據, 有時候會調用虛擬傳感器和合成傳感器. 線性加速傳感器和重力傳感器就是軟件傳感器的栗子. 下表總結了Android平臺可以支持的傳感器.

只有少部分Android設備擁有全部類型的傳感器. 比如大多數手持設備和平板擁有加速計和磁力計, 但是很少但設備擁有氣壓計和溫度計. 同樣的一個設備可以擁有多於一種傳感器, 比如一個設備可以擁有兩個重力傳感器, 每個有一個不同的範圍.

傳感器

類型

描述

常用

TYPE_ACCELEROMETER

硬件

測量設備三個方向(x,y和z)的加速度, 單位是m/s2(米每秒平方). 包括重力.

運動檢測(晃動, 傾斜等)

TYPE_AMBIENT_TEMPERATURE

硬件

測量室內環境溫度. 單位是攝氏度.

監測空氣溫度.

TYPE_GRAVITY

軟件或者硬件

測量重力加速度, 單位m/s2.

運動檢測(晃動, 傾斜等)

TYPE_GYROSCOPE

硬件

測量設備的旋轉速度, 單位是rad/s. 測量三個物理軸.

旋轉檢測.

TYPE_LIGHT

硬件

測量環境光照等級, 單位lx.

控制屏幕亮度.

TYPE_LINEAR_ACCELERATION

軟件或者硬件

測量一個設備上的三個物理軸的加速度, 不包括重力.

監測單個軸線的加速度.

TYPE_MAGNETIC_FIELD

硬件

測量三個物理軸的磁場, 單位是μT

創建一個指南針.

TYPE_ORIENTATION

軟件

測量一個設備所有三個物理軸的旋轉度數.

確定設備位置.

TYPE_PRESSURE

硬件

測量環境空氣壓力, 單位是hPa或者mbar.

檢測氣壓改變.

TYPE_PROXIMITY

硬件

測量一個物體與設備屏幕的距離, 單位是cm. 通常用來確定電話是否靠近人耳朵.

打電話的時候電話的位置.

TYPE_RELATIVE_HUMIDITY

硬件

測量相對溼度, 單位是百分比.

監測絕對和相對溼度.

TYPE_ROTATION_VECTOR

軟件或者硬件

通過旋轉矢量的三個元素測量設備的方向.

運動檢測和旋轉檢測.

TYPE_TEMPERATURE

硬件

測量設備溫度, 單位是攝氏度. 不同設備間該傳感器實現不同. 在API 14中, 該傳感器被TYPE_AMBIENT_TEMPERATURE代替.

監測溫度.

SensorFramework:

我們可以使用Sensor Framework訪問這些傳感器並請求原始數據. Sensor Framework是android.hardware包的一部分, 包含這些的類和接口:

l  SensorManager: 我們可以使用該類來創建一個傳感器服務的實例. 它提供了多個方法來訪問和列舉傳感器, 註冊和註銷傳感器事件監聽器, 獲取方位信息. 該類還提供了多種傳感器常量, 它們用來報告傳感器精確度, 設置數據獲取頻率和校準傳感器.

l  Sensor: 我們可以使用該類來創建指定傳感器的實例. 它提供了多種方法可以讓我們確定傳感器的能力.

l  SensorEvent: 系統使用該類來創建一個傳感器事件對象, 它提供了關於傳感器事件的信息. 一個傳感器事件對象包含這些信息: 傳感器原始數據, 傳感器產生的事件, 數據的精度還有事件的時間戳.

l  SensorEventListener: 可以使用該接口來創建兩個回調方法來接收傳感器數值改變或傳感器精度改變的提醒(傳感器事件).

在一個典型的使用這些傳感器相關的APP來完成這兩件基本任務:

l  識別傳感器和傳感器能力: 如果APP擁有某些指定的傳感器相關的功能的話, 那麼在運行時識別傳感器和傳感器能力是十分有必要的. 慄如, 我們可能想要識別所有設備中展示的傳感器, 並禁用不支持的傳感器功能. 同樣的, 我們可能想要識別所有的傳感器類型, 這樣可以有選擇的實現傳感器, 來保證APP的最佳性能.

l  監測傳感器事件: 監測傳感器事件是獲得傳感器原始數據的方法. 一個傳感器事件會在每次傳感器感知到它測量的參數發生變化的時候發生. 一個傳感器事件提供給我們四片信息: 引發該事件的傳感器的名字, 事件時間戳, 事件的精度, 還有引發時間的原始數據.

傳感器可用性:

傳感器可用性會在不同的設備間變化, 也會在不同的Android版本間變化. 這是因爲Android的傳感器經常誇版本發佈. 慄如, 很多傳感器在Android1.5中引入, 但是一些在Android2.3之前並沒有實現也不可用. 同樣的, 一些傳感器在Android2.3和Android4.0引入. 兩個傳感器已經被更好更新的傳感器替代.

下表總結了各種傳感器在版本更迭中的變化. 這裏只列出了4個平臺版本, 因爲傳感器在這些版本中發生了變化. 被列爲不推薦使用的傳感器仍然可以在隨後的平臺使用(提供的傳感器必須在設備上..).

傳感器

Android 4.0

Android 2.3

Android 2.2

Android 1.5

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中添加, 但是在Android2.3之前不可用.

帶2的表示: 該傳感器可用, 但是不推薦使用.

識別傳感器和傳感器能力:

Android sensor framework提供了一些方法讓我們可以在運行時很容易的確認設備上有哪些傳感器. API也提供了讓我們可以確認傳感器的能力, 比如它的最大範圍, 分辨率, 和它的電源需求. 想要識別設備上的傳感器, 首先我們需要獲取一個sensor service的參考. 要實現這個, 必須先創建一個SensorManager類的實例, 與其它的系統服務一樣, 要用getSystemService()方法來獲取, 這次傳給它的參數是SENSOR_SERVICE. 栗子:

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不要求設備生產廠家簡歷任何指定類型的傳感器, 所以設備可以擁有廣泛的傳感器配置. 除了列出的這些設備傳感器, 我們還可以使用Sensor類的公共方法來確定一個獨立傳感器的能力和屬性. 這個功能很有用, 比如我們可以使用getResolution()和getMaximumRange()方法來獲取傳感器的分辨率和最大測量範圍. 還可以使用getPower()方法來獲取傳感器的電量需求.

如果我們想要優化自己的APP支持不同供應商的傳感器和不同版本的傳感器, 那麼有兩個公共方法是非常有效的. 比如如果APP需要檢測用戶手勢如傾斜和震動, 那麼應該創建一組數據過濾規則, 併爲特定供應商的新設備重力傳感器提供優化, 和另一組數據過濾規則併爲只有加速度計沒有重力傳感器的設備提供優化. 下面的代碼展示瞭如何使用getVendor()和getVersion()方法來實現這個功能. 在該栗子中, 查找了Google公司的重力傳感器和支持版本號爲3. 如果沒有這個傳感器, 那麼嘗試使用加速度計. 栗子:

private SensorManager mSensorManager;
private Sensor mSensor;

...

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

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);
    }
  }
}
else{
  // Use theaccelerometer.
  if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){
    mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
  }
  else{
    // Sorry, thereare no accelerometers on your device.
    // You can'tplay this game.
  }
}

另一個有用發的方法是getMinDelay(), 它返回了一個傳感器可以感應數據的最小時間間隔(單位是微秒). 任何getMinDelay()返回非空值的傳感器都是一個”流傳感器”(streaming sensor). 流傳感器通過固定的時間間隔感應數據, 在Android 2.3版本中引入. 如果一個傳感器在getMinDelay()中返回了0, 那麼意味着傳感器不是一個流傳感器, 因爲它只有在感應到參數變化的時候纔會報告數據.

getMinDelay()方法很有用, 因爲它讓我們確定了傳感器可以獲取數據的最大頻率. 如果APP的某些功能需要高速率的數據採集或者流傳感器, 可以使用該方法來確定一個傳感器是否滿足這些要求, 然後啓動或關閉相關功能.

注意: 傳感器的最大數據獲取速率並不一定就是sensor framework提供給APP的. Sensor framework通過傳感器事件來報告數據, 還有幾個別的因素也會影響APP接收傳感器事件的頻率. 下一小節詳解.

監測傳感器事件:

想要監測原始傳感器數據我們需要通過SensorEventListener實現兩個回調方法, onAccuracyChanged()和onSensorChanged(). 當下列事件發生的時候, Android會調用這倆方法:

l  傳感器精度變化: 這種情況下系統會調用onAccuracyChanged()方法, 提供新的傳感器精度和Sensor對象. 精度由四個靜態常量表示: SENSOR_STATUS_ACCURACY_LOW,SENSOR_STATUS_ACCURACY_MEDIUM, SENSOR_STATUS_ACCURACY_HIGH,SENSOR_STATUE_UNRELIABLE.

l  傳感器上報了新的數據:這種情況下, 系統會調用onSensorChanged()方法, 它提供了一個SensorEvent對象. SensorEvent對象包含關於新傳感器數據的信息, 這其中包括: 傳感器精度,生成數據的傳感器, 生成數據的時間戳, 還有傳感器記錄的新數據.

下面這段代碼展示瞭如何使用onSensorChanged()方法來監測亮度傳感器的數據變化. 該栗子在main.xml文件中的TextView(名爲sensor_data)中顯示傳感器的原始數據.

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 somethinghere if sensor accuracy changes.
  }

  @Override
  public final void onSensorChanged(SensorEvent event) {
    // The lightsensor returns a single value.
    // Many sensorsreturn 3 values, one for each axis.
    float lux = event.values[0];
    // Do somethingwith 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);
  }
}

上慄中, 默認數據延遲(SENSOR_DELAY_NORMAL)在註冊的時候傳給registerListener()作爲參數. 數據延遲(或者採樣率)控制onSensorChanged()方法通知APP傳感器事件的頻率. 默認數據延遲適用於監測通常的屏幕方向改變, 使用200000微妙的延遲. 我們可以指定其它數據延遲, 比如SENSOR_DELAY_GAME(2000微秒延遲), SENSOR_DELAY_UI(60000微秒), 或者SENSOR_DELAY_FASTEST(0微秒延遲). 在Android3.0中可以用一個絕對的值指定延遲 (微秒).

我們指定的延遲只是一個建議的延遲. Android系統和其他的APP可以更改這個延遲. 最好的證明方法是指定一個可以指定的最大的延遲, 因爲系統通常會使用一個比我們指定的更小的延遲(就是說我們應該使用APP邏輯中可以接受的最慢的採樣率). 使用更大的延遲可以降低處理器的消耗, 這樣可以節省電量.

沒有公共方法可以確定sensor framework發送傳感器事件的頻率. 但是我們可以使用傳感器事件附帶的時間戳來計算事件採樣率. 我們不應該在設置了採樣率(延遲)之後去修改它. 如果處於某些原因需要修改, 那麼必須得註銷再註冊傳感器監聽器.

還有一件需要留意的事情, 就是上面的栗子中在onResume()和onPause()回調方法中註冊和註銷傳感器事件監聽器. 最佳的做法是應該總是禁用那些不需要用到的傳感器, 特別是當activity處於pause的狀態的時候. 如果不這樣做的話可能在短時間內就會耗盡電池的電量, 因爲一些傳感器需要很大的功率. 在屏幕關閉後系統並不會自動禁用傳感器.

處理不同的傳感器的配置:

Android不會爲設備指定一個標準的傳感器配置, 這意味着設備開發商可以用它們喜歡的任意傳感器配置, 導致設備的傳感器可能包含很多配置. 比如Motorola Xoom有一個壓力傳感器, 但是Samsung Nexus S則沒有. 同樣, Xoom和Nexus S有陀螺儀, 但是HTC Nexus One沒有. 如果APP依賴於一個指定類型的傳感器, 那麼我們必須確保傳感器在設備上存在, APP才能運行成功. 有兩種可選的方案用於確認某傳感器是否在設備上:

l  在運行時檢查傳感器並啓動或禁用對應的應用功能.

l  使用Google Play過濾器來過濾目標傳感器配置.

現在來討論下這兩種方法:

運行時檢查傳感器:

如果APP使用一個指定類型的傳感器, 但是不依賴於它, 那麼我們可以使用sensor framework在運行時檢查傳感器, 然後決定APP是否啓用相應的功能. 慄如, 一個導航APP可能使用溫度傳感器, 壓力傳感器, 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! Nopressure sensor.
  }

使用Google Play過濾器指定目標傳感器配置:

如果我們要在Google Play上fault自己的APP, 那麼我們可以在manifest中使用<uses-feature>標籤來從那些不帶合適的傳感器配置的設備中過濾APP(沒有傳感器我就不安裝). <uses-feature>標籤有一些硬件描述符讓我們可以基於指定的傳感器過濾APP. 我們可以使用的傳感器有: 加速度計, 氣壓計, 指南針(地磁力計), 陀螺儀, 強度和距離傳感器. 下面是一個使用manifest的栗子, 它要求有加速度計:

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

如果添加了這個標籤和描述符到APP中, 用戶將會只能在他們的設備上擁有加速計的情況下才能看到該APP. 我們應該只在APP完全依賴於指定傳感器的時候才使用android:required=”true”. 如果APP使用傳感器用於某些功能而不是全部, 那麼應該使用android:required=”false”. 這將使APP可以安裝到沒有該傳感器的設備上. 請記住, 如果APP使用了一個指定的傳感器, 但是沒有傳感器的情況下依然可以使用, 那麼應該在運行時檢測傳感器, 並啓用或禁用某些APP功能.

傳感器的座標系:

通常, sensor framework使用一個標準的三維座標系來表達數據值. 對於大多數傳感器來說, 當設備保持默認方向的時候座標系的定義是與設備屏幕相關的(如下圖). 當設備保持默認方向的時候, X軸表示橫向並指向右邊, Y軸表示縱向並指向上面, Z軸指向屏幕的正對着的方向. 在該座標系中, 屏幕背後的Z值是負數.


該座標系被這些傳感器使用:

l  加速度傳感器.

l  重力傳感器.

l  陀螺儀.

l  線性加速傳感器.

l  地磁傳感器.

要理解這個座標系的最重要的一點是, 當屏幕旋轉的時候, 各軸並不會交換位置. 就是說, 傳感器的座標系永遠都不會隨着設備移動而變化. 這種行爲跟OpenGL中的座標系是一樣的.另外一個比較重要的是APP一定不能假設設備的自然(默認)方向就是縱向的. 自然方向對於很多平板設備來說是橫向的. 傳感器座標系總是基於設備的自然方向的.

最後, 如果APP的傳感器匹配了屏幕顯示, 我們需要使用getRotation()方法來確定屏幕方向, 並使用remapCoordinateSystem()方法來映射傳感器座標到屏幕座標. 就算manifest中指定了只支持縱向(portrait-only).更多關於傳感器座標系統的信息, 包括如何處理屏幕方向, 可以參考OnScreen Turn Deserves Another.

注意: 一些傳感器和方法使用全球參考框架相關的座標系統(相對於設備參考框架). 這些傳感器和方法返回的設備運動或者位置的數據是相對於地球的. 更多信息可以參考getOrientation()方法, getRotationMatrix()方法, Orientation Sensor和Rotation Vector Sensor.

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

如果想要設計自己的傳感器實現, 那麼請留意這小節中討論的內容. 這些是通過sensor framework訪問傳感器和獲取傳感器數據的最佳方案.

註銷傳感器監聽器:

當使用傳感器之後或者傳感器所在的activity暫停了, 要確保註銷傳感器監聽器. 如果傳感器監聽器處於註冊狀態並且它的activity暫停了, 那麼傳感器將會繼續獲取數據並消耗電池電量, 除非註銷它. 下面的代碼演示如何在onPause()中註銷一個監聽器:

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

不要在模擬器上測試代碼:

當前不能在模擬器上測試傳感器的代碼, 因爲模擬器不能模擬傳感器. 我們必須在真機上測試傳感器相關的代碼. 但是有一些傳感器模擬器可以用來模擬傳感器輸出.

不要阻塞onSensorChanged()方法:

傳感器數據可以被高頻率的更新, 這意味着系統可能會很頻繁的調用onSensorChanged()方法. 最佳的做法是在該方法中做最少的必要的事情以保證不會阻塞它. 如果APP需要實現任何數據過濾或者減少傳感器數據, 我們都應該在onSensorChanged()方法外面實現這些工作.

避免使用不推薦的傳感器類型或方法:

一些方法和常量已經不推薦使用了. 特別是TYPE_ORIENTATION傳感器類型. 想要得到方向數據我們應該使用getOrientation()方法代替. 同樣, TYPE_TEMPERATURE也不推薦使用了, 在Android4.0版本以上我們應該用TYPE_AMBIENT_TEMPERATURE來代替它.

在使用之前確認傳感器:

在使用傳感器之前應該總是要確保它們是否可用. 不要因爲常用就簡單的假設有個傳感器存在. . .設備生產商沒有必要一定提供任何一種傳感器.

細心的選擇傳感器延遲:

當我們用registerListener()方法註冊一個傳感器的時候, 確保我們爲APP選擇了一個合適的頻率. 傳感器可以以很高的頻率提供數據. 讓系統發送不必要的數據會消耗很多系統資源和電量.

 

總結:

本文主要介紹了傳感器的基礎知識, 包括種類, 基本用法以及一些使用原則. 之後會詳細介紹每種傳感器.

管理傳感器使用的是SensorManager, 可以通過它來獲取設備支持的傳感器列表, 以及某種傳感器是否存在於設備上. 可以通過它的getDefaultSensor()方法來獲取默認的某種傳感器, 也就是一個Sensor對象.

當擁有了一個Sensor對象之後就有了對一個傳感器的控制權, 我們可以通過SensorManager.registerListener()方法來監聽數據改變的事件了. 這裏還必須實現SensorEventListener接口, 該接口有兩個我們要用到的方法, 就是onAccuracyChanged()和onSensorChanged()分別代表傳感器精度變化和數值變化. 這樣我們就可以獲取傳感器數據了.

關於使用原則, 我們要控制傳感器數據的更新頻率, 可以通過registerListener方法來指定, 不要做不必要的更新以防浪費系統資源和電量. 在使用之前還要記得對傳感器是否存在做判斷, That’s all!

 

參考: https://developer.android.com/guide/topics/sensors/sensors_overview.html

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