Android傳感器概述(五)

識別傳感器和傳感器能力

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()方法有用是因為它會讓你判斷傳感器能夠獲取數據的最大的頻率。如果在你的應用程序中某個功能需要高精度頻率或流傳感器,就能夠使用這個方法來判斷一個傳感器是否滿足這些要求,然後在你的應用程序中啟用或禁止相關功能。

警告:傳感器最大的數據采集頻率不一定是傳感器框架把傳感器數據發送給你的應用程序的頻率。傳感器框架通過傳感器事件來報告數據,並且有幾個因素會影響應用程序接收傳感器事件的頻率

You May Also Like