識別感應器和感應器能力
Android感應器架構提供了幾個方法,這些方法讓你在運行時能夠容易判斷裝置上的感應器。API還提供了幾個讓你判斷每個感應器能力的方法,如最大範圍、識別率、功率需求等。
要識別裝置上的感應器,首先需要獲得一個引用感應器服務。通過調用getSystemService()方法並給它傳遞SENSOR_SERVICE參數來建立一個SensorManager類的執行個體,可以獲得一個感應器服務。例如:
private SensorManager mSensorManager;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
接下來,調用帶有TYPE_ALL常量的getSensorList()方法能夠獲得裝置上的所有感應器列表。例如:
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類的Public方法來判斷個別感應器的能力和屬性。如果想要你的應用程式有別於基本感應器或裝置上可用感應器的行為,這是非常有用的。例如,使用getResolution和getMaximumRange()方法來擷取感應器的識別率和最大的測量範圍,也能夠使用getPower方法來擷取感應器器的功率需求。
如果你想要對不同製造商的感應器或不同版本的感應器來最佳化你應用程式,有兩個public方法是特別有用的。例如,如果你的應用程式需要監視使用者諸如擺動和震動這樣的手勢,你能夠建立一組針對有比較新的向量重力感應器的裝置資料最佳化過濾規則,和另一組針對沒有重力感應器且只有加速度感應器的裝置資料最佳化過濾規則。下列程式碼範例示範了如何使用getVendor()和getVersion()方法來做這件事。在這個樣本中,我們尋找Google Inc中列出的有版本數字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 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()方法返回非零值的感應器是流感應器。流感應器週期性感知資料,並在Android2.3(API Level 9)被引入。如果調用getMinDelay()方法時返回0,這意味著感應器不是流感應器,因為它只在變化的時候報告它感知到的資料。
getMinDelay()方法有用是因為它會讓你判斷感應器能夠擷取資料的最大的頻率。如果在你的應用程式中某個功能需要高精度頻率或流感應器,就能夠使用這個方法來判斷一個感應器是否滿足這些要求,然後在你的應用程式中啟用或禁止相關功能。
警告:感應器最大的資料擷取頻率不一定是感應器架構把感應器資料發送給你的應用程式的頻率。感應器架構通過感應器事件來報告資料,並且有幾個因素會影響應用程式接收感應器事件的頻率