检查传感器是否存在和工作的可靠方法是什么?
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 值。使用完传感器后,别忘了注销。
我在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 值。使用完传感器后,别忘了注销。