识别传感器和传感器能力
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()方法有用是因为它会让你判断传感器能够获取数据的最大的频率。如果在你的应用程序中某个功能需要高精度频率或流传感器,就能够使用这个方法来判断一个传感器是否满足这些要求,然后在你的应用程序中启用或禁止相关功能。
警告:传感器最大的数据采集频率不一定是传感器框架把传感器数据发送给你的应用程序的频率。传感器框架通过传感器事件来报告数据,并且有几个因素会影响应用程序接收传感器事件的频率。