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.

  • Android - SensorManager comportamiento extraño de getOrientation
  • Android: Problemas al calcular la orientación del dispositivo
  • Cómo construir un simulador de sensores para Android?
  • ¿Cómo puedo rotar la pantalla sólo en modo horizontal en android?
  • Android: ¿Cómo se trata con baromters inexactos?
  • Cómo usar los datos del sensor onSensorChanged en combinación con OpenGL
  • ¿Puede guardar / ver un archivo de vídeo y los datos del sensor simultáneamente?
  • Cómo utilizar SensorManager.getOrientation () en lugar de TYPE_ORIENTATION
  • Necesidad de calcular el vector de rotación a partir de los datos de Sensor.TYPE_ORIENTATION
  • Android PhoneGap obtener guiñada, tono, rollo, relativo a las coordenadas de tierra
  • ¿Cómo reemplazar adecuadamente Sensor.TYPE_ORIENTATION (que ahora está obsoleto)?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.