UnregisterListener no funciona con PROXIMITY_SCREEN_OFF_WAKE_LOCK

Tengo este código

public class MainActivity extends AppCompatActivity implements SensorEventListener { private SensorManager mSensorManager; private Sensor mProximity; private PowerManager mPowerManager; private PowerManager.WakeLock mWakeLock; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); } @Override protected void onResume() { super.onResume(); mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this); } @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) { if (event.values[0] == 0) { //near Toast.makeText(getApplicationContext(), "near", Toast.LENGTH_SHORT).show(); turnOffScreen(); } else { //far Toast.makeText(getApplicationContext(), "far", Toast.LENGTH_SHORT).show(); turnOnScreen(); } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } public void turnOffScreen() { mWakeLock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "tag"); mWakeLock.acquire(); } public void turnOnScreen() { mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag"); mWakeLock.acquire(); } } 

Cuando la aplicación está durmiendo o va a otra actividad, el sensor sigue funcionando. ¿Alguna idea?

Tomé otra manera de arreglar este problema, porque nadie sabe cómo arreglar esto, así que con este código no necesito utilizar SensorManager. Ahora uso dos funciones para arrancar y detener el sensor, creo que es la única solución.

 import android.content.Context; import android.os.PowerManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private PowerManager mPowerManager; private PowerManager.WakeLock mWakeLock; private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); } public void activateSensor(View v) { Toast.makeText(MainActivity.this, "Proximity On", Toast.LENGTH_LONG).show(); if (mWakeLock == null) { mWakeLock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "incall"); } if (!mWakeLock.isHeld()) { Log.d(TAG, "New call active : acquiring incall (CPU only) wake lock"); mWakeLock.acquire(); } else { Log.d(TAG, "New call active while incall (CPU only) wake lock already active"); } } public void deactivateSensor(View v) { Toast.makeText(MainActivity.this, "Proximity Off", Toast.LENGTH_LONG).show(); if (mWakeLock != null && mWakeLock.isHeld()) { mWakeLock.release(); Log.d(TAG, "Last call ended: releasing incall (CPU only) wake lock"); } else { Log.d(TAG, "Last call ended: no incall (CPU only) wake lock were held"); } } } 

Y este es mi activity_main.xml

  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.javier.proximitysensor.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/activity_main_turn_on_screen" android:onClick="activateSensor" android:text="@string/activity_main_activate_sensor" /> <Button android:id="@+id/activity_main_turn_on_screen" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:onClick="deactivateSensor" android:text="@string/activity_main_deactivate_sensor" /> </RelativeLayout> 

Gracias…

También puedes comprobar este ejemplo en GitHub

En su código inicial no ha manejado liberar el bloqueo de la sesión correctamente. Cuando su actividad esté en onStop, anule el registro de su oyente y también suelte el bloqueo de la sesión de espera.

Utilice la función wakeLock.setReferenceCounted(false) . Lo he usado, y funciona.

  • ¿El filtrado del acelerómetro de Android?
  • Activar y desactivar la pantalla mediante programación en android
  • Valor de retorno falso inesperado de android.hardware.SensorManager.registerListener en Android 4.3
  • Detectar si el teléfono está en el bolsillo o no
  • Cómo construir un simulador de sensores para Android?
  • Rotación Opengl de Android con datos de sensores
  • Azimut encontrado con Sensor.TYPE_MAGNETIC_FIELD mucho más inestable que Sensor.TYPE_ORIENTATION
  • Android: Problemas al calcular la orientación del dispositivo
  • Sistema de coordenadas del dispositivo Android Convert a sistema de coordenadas "usuario"
  • Protocolo de comunicación fiable y ligero para móviles
  • Cómo saber si mi SensorManager tiene un Sensor registrado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.