android傳感器的種類
Sensor framework
使用Android的sensor framework,可以訪問設備上可用的傳感器勾哩,獲取傳感器原始數(shù)據(jù)歇僧。比如:
1.查看設備上可用的傳感器。
2.查看某一個傳感器的性能瘾境,比如它的量程铐刘、分辨率陪每、能量要求等。
3.獲取測量數(shù)據(jù)镰吵,并且設置刷新頻率檩禾。
4.注冊和注銷傳感器事件監(jiān)聽器。
Sensor framework是android.hardware這個包的一部分疤祭,包含下面一些重要的類:SensorManager, Sensor, SensorEvent, SensorEventListener
識別傳感器
Android sensor framework
提供了一些方法盼产,使得在運行時可以方便地查看設備上都有哪些傳感器。
首先勺馆,需要獲取sensor service的一個引用戏售;即通過向 getSystemService()
方法中傳入SENSOR_SERVICE 參數(shù)來創(chuàng)建一個SensorManager類的實例。
private SensorManager mSensorManager;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
然后草穆,可以通過在getSensorList() 方法中傳入TYPE_ALL來獲取設備上的所有傳感器灌灾。
List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
如果想要獲取指定類型的一系列傳感器,可以使用參數(shù)TYPE_GYROSCOPE悲柱,TYPE_LINEAR_ACCELERATION或TYPE_GRAVITY等锋喜。
對于某種特定類型的傳感器來說,設備上含有不止一個這種傳感器诗祸,那么這些傳感器中的一個將被指定為這種類型的默認傳感器跑芳。使用getDefaultSensor()方法并且傳入特定的傳感器類型轴总,可以得到此類型的默認傳感器直颅。
使用傳感器之前需要檢測相應的傳感器是否存在,因為并不是沒臺設備都包含想要使用的傳感器
Sensor mSensor = mManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
if (mSensor == null){
//傳感器不存在
}
還可以通過Android Market過濾器來限定目標設備必須帶有指定的傳感器
<uses-feature
android:name="android.hardware.sensor.orientation"
android:required="true">
</uses-feature>
監(jiān)聽傳感器事件
為了檢測傳感器數(shù)據(jù)怀樟,需要實現(xiàn)SensorEventListener接口中的兩個回調方法:onAccuracyChanged()和 onSensorChanged()功偿。
private SensorEventListener listener = new SensorEventListener() {
/**
* 傳感器事件值改變回調
*/
@Override
public void onSensorChanged(SensorEvent event) {
//判斷傳感器
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
//讀取傳感器測量值
float angularX = event.values[0];
}
}
/**
* 傳感器精度發(fā)生改變時候的回調
*/
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
注冊和注銷傳感器監(jiān)聽
通過registerListener方法注冊傳感器監(jiān)聽
protected void onResume() {
super.onResume();
mSensorManager.registerListener(listener, mLight, SensorManager.SENSOR_DELAY_NORMAL);
}
通過unregisterListener方法注銷傳感器監(jiān)聽
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(listener);
}
注:當不需要傳感器時你應該關閉它,特別是activity暫停的時候往堡。如果不這么做你的電池會很快消耗完械荷,系統(tǒng)不會在屏幕關閉的時候自動關閉傳感器。
用 registerListener()注冊時使用了默認的數(shù)據(jù)延遲SENSOR_DELAY_NORMAL
數(shù)據(jù)延遲(或叫采樣率)控制著通過onSensorChanged()方法傳遞傳感器事件的間隔虑灰。
默認的數(shù)據(jù)延遲(200,000 microseconds)對于監(jiān)控屏幕方向改變比較合適吨瞎;其他的:
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)可以使用絕對值來設置數(shù)據(jù)延遲(單位是毫秒)穆咐。
設定的延遲只是一個建議性的延遲颤诀,Android系統(tǒng)或其他應用可以改變這個延遲字旭。
最好的實踐經驗是,指定可用的最大延遲崖叫,因為系統(tǒng)通常是用一個比你指定的值小一些的值遗淳。
這就是說,需要指定滿足應用需求的最低的采樣率心傀。用比較大的延遲可以使處理器負載較輕屈暗,從而消耗更少的能量。
一旦設定后脂男,不必改變采樣率阵子;如果因為某種理由你必須改變采樣率,你必須注銷吓歇,然后重新注冊這個sensor listener表窘。
傳感器坐標系統(tǒng)
通常,sensor framework使用一個標準的三軸坐標系統(tǒng)來表達數(shù)值堕油。
對于大多數(shù)傳感器來說潘飘,坐標系統(tǒng)是相對于設備屏幕來說的。
當一個設備被放在其默認的方向上時掉缺,X軸是水平指向右的卜录,Y軸是垂直向上的,Z軸是指向屏幕正面之外的眶明,即屏幕背面是Z的負值艰毒。
在屏幕方向改變的時候,坐標系中的軸是不會交換的搜囱。
不能假設設備的自然(默認)方向是豎直的(portrait)丑瞧,自然方向對于很多的平板設備來說是橫向的(landscape)。