检查传感器是否存在和工作的可靠方法是什么?

What's the sure-fire way to check if a sensor exists and IS WORKING?

我在SO上看到了很多方法:

PackageManager manager = getPackageManager();
boolean hasLightSensor = manager.hasSystemFeature(PackageManager.FEATURE_SENSOR_LIGHT);

还有一个:

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor light = sm.getDefaultSensor(Sensor.TYPE_LIGHT);
if (light != null) {
...
}

还有一个:

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor light = sm.getDefaultSensor(Sensor.TYPE_LIGHT);
SensorEventListener listener = new SensorEventListener() {
     // create sensor listener
}
boolean hasLightSensor = sm.registerListener(listener, light, SensorManager.SENSOR_DELAY_NORMAL);

在 Android 传感器错误处理中涉及相当多的 class 元素和方法。我发现获得明确答案的最佳方法是查看源代码,但有时这会陷入困境。

SensorManager is an abstract class that defines the methods to get the sensor list. getDefaultSensor()calls getSensorList(). If no sensors are found, getDefaultSensor will return null. The Android Sensor Best Practices 页面因此建议在使用之前检查传感器是否存在,如下所示:

if (sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null) {
    // Success! There's a pressure sensor.
} else {
    // Failure! No pressure sensor.
}

您可能还需要验证 registerListener() 调用的 return 值。 registerListenerImpl methods are implemented in SystemSensorManager,它是扩展 SensorManager 的具体 class。 registerListener 将:

  • return false 如果任何输入参数无效
  • 如果超过 MAX_LISTENER_COUNT 则抛出一个 IllegalStateException
  • return false 如果无法将传感器添加到与提供的 SensorEventListener
  • 关联的 SensorEventQueue

最后一点很重要。 BaseEventQueue class(SensorEventQueue 的基础 class)提供了一个名为 addSensor() 的方法,它可以 return false 如果:

  • 传感器已经添加到队列中并且处于活动状态
  • 传感器不支持提供的批量报告延迟
  • 无法启用传感器

最后一点非常重要,因为 false 的 return 值可能表示传感器故障。要了解有关导致传感器无法启用的原因的更多信息,您需要查看 C++ 中的 Native Sensor Manager 代码。可以这么说,您应该始终检查 registerListener() 调用的 return 值。使用完传感器后,别忘了注销。