Android Sensors (2) 傳感器API的使用


 

識別傳感器和傳感器能力

  Android sensor framework提供了一些方法,使得你在運行時可以方便地查看設備上都有哪些傳感器。

  API也提供了一些讓你獲取每個傳感器性能的方法。

  首先,你需要獲取sensor service的一個引用;即通過向 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_GYROSCOPETYPE_LINEAR_ACCELERATIONTYPE_GRAVITY等。

  如果對於某種特定類型的傳感器來說,設備上含有不止一個這種傳感器,那么這些傳感器中的一個將被指定為這種類型的默認傳感器

  使用getDefaultSensor()方法並且傳入特定的傳感器類型,可以得到此類型的默認傳感器

  如果此類型的默認傳感器不存在,那么這個方法將會返回null,這就意味着這個設備不含此類型的傳感器

  除了列出設備上的傳感器,你可以利用Sensor 類中的方法去獲得傳感器的性能及屬性。當你需要你的應用在不同的設備環境下有不同的行為時,這樣做是很有用的。

 

監測傳感器事件

  為了檢測傳感器數據,你需要實現SensorEventListener 接口中的兩個回調方法:onAccuracyChanged()和 onSensorChanged()

 

當傳感器的精度改變時:

  系統調用 onAccuracyChanged() 方法,為你提供Sensor對象的引用和新的精度值。

  精度值一般由下面四個狀態常量之一表示:SENSOR_STATUS_ACCURACY_LOWSENSOR_STATUS_ACCURACY_MEDIUM,SENSOR_STATUS_ACCURACY_HIGH, or SENSOR_STATUS_UNRELIABLE

 

當傳感器報告一個新的值時:

  系統調用onSensorChanged() 方法,為你提供一個SensorEvent對象。

 

一個檢測傳感器事件的例子

  如下面這個例子:

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 microseconds)對於監控屏幕方向改變比較合適;其他的:

   SENSOR_DELAY_GAME (20,000 microsecond delay), SENSOR_DELAY_UI (60,000 microsecond delay), 

   SENSOR_DELAY_FASTEST (0 microsecond delay),另外Android 3.0 (API Level 11)可以使用絕對值來設置數據延遲(單位是毫秒)。

  你設定的延遲只是一個建議性的延遲,Android系統或其他應用可以改變這個延遲。

  最好的實踐經驗是,你指定可用的最大延遲,因為系統通常是用一個比你指定的值小一些的值。

  這即是說,你需要指定滿足你應用需求的最低的采樣率。用比較大的延遲可以使處理器負載較輕,從而消耗更少的能量。

  沒有指定sensor framework向應用發送sensor event頻率的public的方法,但是,你可以利用每一個sensor event的時間戳去計算幾個事件的采樣率。

  一旦設定后,你不必改變采樣率;如果因為某種理由你必須改變采樣率,你必須注銷(unregister然后重新注冊(reregister這個sensor listener。

 

注冊和注銷位置

  這個例子中使用了 onResume() 和onPause() 回調函數來注冊和注銷傳感器事件監聽器。

  最佳實踐:當你不需要傳感器時你應該關閉它,特別是你的activity暫停的時候。

  如果不這么做你的電池會很快消耗完,系統不會在屏幕關閉的時候自動關閉傳感器。

 

 

參考資料

  API Guides:Sensors Overview

  http://developer.android.com/guide/topics/sensors/sensors_overview.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM