安卓接近传感器在三星设备上存在问题

10

避免问题的具体场景:
三星设备中Activity的行为方式不同,每次检测到接近时,仅在三星设备上会导致对onPause()/onResume()的调用。

我在onPause()中清除了接近传感器,这导致了一种独特于三星设备的行为。

希望这能为面临此问题的任何人节省一些时间。我从onPause()中删除了清除接近监听器的调用,现在在提到的设备上按预期工作。

更新:

下面提到的不是唯一的问题,接近传感器的行为并不一致。另一个问题是一个L-O-C:

if (!mWakeLock.isHeld()) mWakeLock.acquire();

随机地,if()对于所提到的设备返回false,因此并不总是调用mWakeLock.acquire()

可能相关的信息:

mWakeLock = mPowerManager.newWakeLock(field, getLocalClassName()); 

where

field = PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK or 32

我的接近传感器代码只在以下设备上运行不正确:
1. 三星 GT-I9082 Android 4.2.2(API 17)[duos grand]
2. 三星 SM-G925I Android 5.1.1(API 22)[s6 edge]

代码:

 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
    ...new SensorEventListener() {
                @Override
                public void onSensorChanged(SensorEvent event) {
                    if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
                        if (event.values[0] <= 5) { //Sleep
                            turnOffScreen();
                        } else { //Wake
                            turnOnScreen();
                        }...
 // registering listener with SensorManager.SENSOR_DELAY_NORMAL);  

问题: 两个设备上的接近传感器返回的记录值波动,即使我们将手放在手机上不动几秒钟;10-15 秒。
例如:
三星6边缘 -

02-10 20:12:36.532: D/SensorManager(3467): Proximity, val = 8.0  [far]
02-10 20:12:36.532: D/SensorManager(29335): Proximity, val = 8.0  [far]
02-10 20:12:36.532: D/DisplayPowerController(3467): [sensor] setProximitySensorEnabled::unregisterListener
02-10 20:12:36.532: D/PowerManagerService(3467): [s] DisplayPowerCallbacks : onProximityNegative()
02-10 20:12:36.562: I/Sensors(3467): Proximity old sensor_state 33554560, new sensor_state : 33554432 en : 0
02-10 20:12:36.632: I/Sensors(3467): Proximity old sensor_state 33554944, new sensor_state : 33555072 en : 1
02-10 20:12:36.642: D/SensorManager(29335): registerListener :: 5, TMD4903 Proximity Sensor, 200000, 0,  
02-10 20:12:36.652: D/SensorManager(29335): Proximity, val = 8.0  [far]
02-10 20:12:36.662: I/Sensors(3467): ProximitySensor - 8(cm)
02-10 20:12:36.672: D/SensorManager(29335): Proximity, val = 8.0  [far]
02-10 20:12:41.752: I/Sensors(3467): Proximity old sensor_state 33554560, new sensor_state : 33554432 en : 0
02-10 20:12:41.822: I/Sensors(3467): Proximity old sensor_state 33554432, new sensor_state : 33554560 en : 1
02-10 20:12:41.842: D/SensorManager(29335): registerListener :: 5, TMD4903 Proximity Sensor, 200000, 0,  
02-10 20:12:41.842: D/SensorManager(29335): Proximity, val = 8.0  [far]
02-10 20:12:41.872: I/Sensors(3467): ProximitySensor - 8(cm)
02-10 20:12:41.872: D/SensorManager(29335): Proximity, val = 8.0  [far]
02-10 20:12:50.482: I/Sensors(3467): ProximitySensor - 0(cm)
02-10 20:12:50.482: D/SensorManager(29335): Proximity, val = 0.0  [close]
02-10 20:12:50.482: D/DisplayPowerController(3467): [sensor] setProximitySensorEnabled::registerListener
02-10 20:12:50.482: D/SensorManager(3467): registerListener :: 5, TMD4903 Proximity Sensor, 200000, 0,  
02-10 20:12:50.482: D/SensorManager(3467): Proximity, val = 0.0  [close]
02-10 20:12:50.482: D/PowerManagerService(3467): [s] DisplayPowerCallbacks : onProximityPositive()
02-10 20:12:50.482: D/PowerManagerService(3467): [s] DisplayPowerCallbacks : onProximityPositive()

三星Duos:波动值的差异在0.0和5.0之间,而不是8.0以上。
  • 还有哪些其他方法或排列组合可以成功准确地解决这个问题?

  • 这是因为不同的传感器吗?GP2A接近传感器和APDS-9930/QPDS-T930接近和光线传感器?

我已经花了很多时间在上面,但都徒劳无功。


请参见:http://stackoverflow.com/questions/33405259/why-sensors-value-is-different-in-different-android-devices/33405362#33405362 - Morrison Chang
准确性不是我的问题,要么我误解了问题,要么我没有理解你想说什么,你能详细说明一下吗? - Pararth
我认为超过1个比特的值,接近传感器的含义取决于ODM,因此,当被覆盖/未覆盖时值发生变化只意味着这是一种实现细节,而不是“不正确”的行为。 - Morrison Chang
这就是我认为我缺少的东西...即使不断地保持覆盖15-20秒,它在此期间内仍然会波动...而且是在被覆盖的情况下。因此,也许还有另一个条件需要检查,如果小于或等于5,则检查powerManager服务和wakelock示例,但是同一设备对于本机和WhatsApp通话具有完美工作的接近传感器wakelock。 - Pararth
你有检查过使用加速度计/方向传感器吗?我认为只有当你将手机靠近耳朵或在强烈阳光下捂住屏幕时,锁定屏幕才有意义。 - Morrison Chang
@MorrisonChang观察到,仅对三星设备,在接近度发生变化时会调用onResume() - Pararth
1个回答

2
原来这是三星设备的已注册问题,以下是一些页面的集合,可以帮助任何面临此问题的人:
  1. 使用onWindowFocusChanged。这对我来说很有意义,我的实现与onPause()相关,遵循相同的规则成功了。
    来源和解释:activity-onpause-to-handle-focus
    对我有帮助的是:在onPause()中不要写;

    @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(!hasFocus){ clearProximityListeners(); } }

  2. 问题 74464: Activity#onPause 在没有 Activity#onResume 的情况下被调用,或者 Context#registerReceiver 失败

  3. 更多参考:
    从一个完全不同的角度来看,Bug on unregister...Otto bus..引用:对我们来说,这只出现在三星设备上。经过快速搜索,...

如果有更清晰的解释,请编辑、纠正和改进答案... 希望能节省一些时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接