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?
- ¿Cómo puedo bloquear el diseño de mi programa Android a una orientación
- Acelerómetro (acceso rápido) mediante NativeActivity NDK
- Galaxy s3 tiene sensor de temperatura?
- ¿Cómo rastrear la posición de un dispositivo Android en un edificio?
- Detectar si el teléfono está en el bolsillo o no
- Android - Cómo acercarse al algoritmo de detección de caídas
- Sistema de coordenadas del dispositivo Android Convert a sistema de coordenadas "usuario"
- Activar y desactivar la pantalla mediante programación en android
- Protocolo de comunicación fiable y ligero para móviles
- Medición de distancia con sensor láser IR Nexus 6P y 5X
- Sensores para teléfonos móviles
- Obtener el ángulo del dispositivo mediante la función getOrientation ()
- Cómo utilizar el evento del sensor Android para determinar si el dispositivo está orientado hacia arriba o hacia abajo
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.
- Acceso a la dirección de casa / trabajo almacenada en Google Maps ("Mi lugar")
- ¿Cuál es la mejor manera de crear una notificación de estilo de medios para Android Lollipop mientras se considera la compatibilidad hacia atrás?