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 rastrear la posición de un dispositivo Android en un edificio?
- ¿Cómo puedo rotar la pantalla sólo en modo horizontal en android?
- Cómo utilizar el evento del sensor Android para determinar si el dispositivo está orientado hacia arriba o hacia abajo
- ¿Cómo puedo bloquear el diseño de mi programa Android a una orientación
- Android PhoneGap obtener guiñada, tono, rollo, relativo a las coordenadas de tierra
- Acelerómetro (acceso rápido) mediante NativeActivity NDK
- Obtener el ángulo del dispositivo mediante la función getOrientation ()
- Android - Cómo acercarse al algoritmo de detección de caídas
- ¿Cómo reemplazar adecuadamente Sensor.TYPE_ORIENTATION (que ahora está obsoleto)?
- Edición de Pitch and Roll de Android
- ¿Puede guardar / ver un archivo de vídeo y los datos del sensor simultáneamente?
- ¿Qué hace SampleRate.MS16, MS32, MS128 stand para cuando está asociado con oyentes de sensor?
- Valor de Android: Sensor.getResolution ()
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?