我需要获取接近传感器的当前值(而不是实现连续监听器)。在一些设备上,第一个报告的值将是默认值(例如“FAR”),其不一定是准确的,并且实际值将仅在第二次或第三次读取之后开始出现。目前,我已经实现了1秒Handler
并使用最后报告的值(在经过第二次之后)作为“真实”值,但这个解决方案似乎很粗糙(而且很慢)。是否有更好的方法适用于所有4.0+设备?我可以简单地计算,直到我收到3个读数,但在某些设备(例如GNex)上,第一个值将是正确的,并且只有在传感器实际发生变化时,该值才会发生变化。
答案 0 :(得分:1)
你可以做我做的事:
你可能在监听器上有一个if
语句 - 一个逻辑流程用于near,一个用于远程
而不是等待处理程序 - 这样做:
if(near) {
myHandler.removeCallbacks(yourRunnableForFar);
myHandler.postDelayed(yourRunnableForNear,100);
else {
myHandler.removeCallbacks(yourRunnableForNear);
myHandler.postDelayed(yourRunnableForFar,100);
}
请注意,不准确的第一个读数将紧跟一个准确的读数,因此最后一个读数“赢”。
如果您没有注册接近度以外的传感器,则此代码可以正常工作。如果您有来自其他传感器的读数流,那么使用静态标志(例如boolean near
)仅在状态更改时触发处理程序调用。
<强>精化:强>
yourRunnableForFar
和yourRunnableForNear
- 是implement Runnable
占位符,用于保持应用程序逻辑在接近传感器返回“近”(event.values[0] == 0
)或“远”(不是)时执行的操作0)。
myHandler
只是您可能创建的任何处理程序,或仅使用Handler myHandler = new Handler(Looper.getMainLooper());
你可能想要在附近获得一个接近锁定,并释放它并清除远处的监听器。但这是应用程序逻辑,可能与应用程序完全不同。