識別傳感器和傳感器能力
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_GYROSCOPE,TYPE_LINEAR_ACCELERATION或TYPE_GRAVITY等。
如果對於某種特定類型的傳感器來說,設備上含有不止一個這種傳感器,那么這些傳感器中的一個將被指定為這種類型的默認傳感器。
使用getDefaultSensor()方法並且傳入特定的傳感器類型,可以得到此類型的默認傳感器。
如果此類型的默認傳感器不存在,那么這個方法將會返回null,這就意味着這個設備不含此類型的傳感器。
除了列出設備上的傳感器,你可以利用Sensor 類中的方法去獲得傳感器的性能及屬性。當你需要你的應用在不同的設備環境下有不同的行為時,這樣做是很有用的。
監測傳感器事件
為了檢測傳感器數據,你需要實現SensorEventListener
接口中的兩個回調方法:onAccuracyChanged()
和 onSensorChanged()
。
當傳感器的精度改變時:
系統調用 onAccuracyChanged()
方法,為你提供Sensor對象的引用和新的精度值。
精度值一般由下面四個狀態常量之一表示:SENSOR_STATUS_ACCURACY_LOW, SENSOR_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