Android感應器概述(五)

來源:互聯網
上載者:User

識別感應器和感應器能力

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

警告:感應器最大的資料擷取頻率不一定是感應器架構把感應器資料發送給你的應用程式的頻率。感應器架構通過感應器事件來報告資料,並且有幾個因素會影響應用程式接收感應器事件的頻率

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.