Pregunta Problema del sensor de proximidad de Android solo en dispositivos Samsung


Escenario específico para evitar problemas:
El comportamiento de la actividad en los dispositivos Samsung fue diferente en la forma en que cada vez que se detectó un cambio, por proximidad, resultó en una llamada a onPause()/onResume() SOLAMENTE en dispositivos SAMSUNG.

Estaba limpiando los sensores de proximidad en onPause() lo que resultó en un comportamiento exclusivo de los dispositivos de Samsung.

Espero que esto ahorre algo de tiempo para cualquiera que se enfrente a esto. Eliminé la llamada de borrar oyentes de proximidad de onPause() y ahora funciona como se esperaba en los dispositivos mencionados.

ACTUALIZAR:

Lo que se menciona a continuación no es el único problema, el sensor de proximidad no se comporta de manera consistente de esa manera. El otro problema es un l-o-c:

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

Aleatoriamente, el if() devuelve falso para los dispositivos mencionados por lo tanto mWakeLock.acquire() no siempre se llama.

posiblemente relevante información:

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

dónde

field = PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK or 32

Mi código de sensor de proximidad funciona incorrectamente solo en
1. Samsung GT-I9082 Android 4.2.2 (API 17) [duos grand]
2. Samsung SM-G925I Android 5.1.1 (API 22) [borde s6]

el código: 

 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);  

el problema: Valores registrados devueltos por el sensor de proximidad en ambos dispositivos fluctuar, incluso mientras colocamos una mano sobre los teléfonos constantemente durante unos segundos; 10-15 sin moverlo.
Me gusta:
Samsung 6 edge-

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()

Samsung Duos: los valores de fluctuación difieren en 0.0 y 5.0 a diferencia de 8.0 arriba

  • ¿Qué otras formas o combinaciones de permutación se pueden aplicar con éxito y precisión para resolver este problema?

  • ¿Es por diferentes sensores? Sensor de Proximidad GP2A y APDS-9930 / QPDS-T930 Proximity & Light?

ya he pasado bastante tiempo en ello ... en vano


9
2018-02-10 15:02


origen


Respuestas:


Resulta que este es un problema registrado con los dispositivos de Samsung, aquí hay una colección de páginas que podría ayudar a cualquiera que se enfrente a esto:

  1. Utilizar onWindowFocusChanged. Esto tenía sentido para mí y mi implementación relacionada con onPause () fue exitosa al seguir el mismo.
    Fuente y explicación: activity-onpause-to-handle-focus
    Lo que me ayudó: en lugar de en onPause();

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

  2. Problema 74464: Actividad # onPause llamada sin Activity # onResume, o puede Context # registerReceiver failed

  3. Más referencia:
    Desde un aspecto bastante diferente, Bug al anular el registro ... Otto bus .. quote: Para nosotros, esto solo aparece en los dispositivos Samsung. Y después de una búsqueda rápida, ... 

Edite, corrija, mejore la respuesta si tiene más claridad ... espero que ahorre algo de tiempo.


2
2018-05-29 10:49