La captura de pulsaciones de teclas cuando el teléfono Android está en modo de suspensión profunda

Descripción del problema

Estoy tratando de escribir una aplicación que va a capturar el volumen hacia arriba / abajo y también los botones del auricular Bluetooth presionando cuando la aplicación está en

  • Fondo
  • Primer plano
  • El fondo y el teléfono están en el modo de dormir (se pulsa el botón de encendido)
  • Primer plano y el teléfono está en el modo de dormir (se pulsa el botón de encendido)

Para los primeros dos puntos tengo que escribir alguna aplicación de prueba y todo funciona en mi caso, envío aplicación a fondo y volumen de prensa hacia arriba / abajo y mi aplicación capturar este eventos. Después de presionar un botón de encendido y mi teléfono pasa al modo de suspensión. Entonces presiono los botones de volumen arriba / abajo del teléfono no reaccionan a esos eventos, y no puedo ver ningún loge en logcat, como todo lo que deja de funcionar.

Aplicaciones que detectan pulsaciones de teclas en el modo de reposo.

Creo que este problema no se puede resolver, pero luego recuerdo que el reproductor de medios estándar de Android captura estos eventos cuando presiona los botones de volumen arriba / abajo mientras se reproduce la música. Creo que esta aplicación puede hacer eso ya que es la aplicación del sistema, pero luego descargar el reproductor Winpm y funciona de la misma manera. Winapm capturar volumen eventos arriba / abajo cuando el teléfono está en modo de dormir. Y las aplicaciones de reproductor de música hacen eso.

Pregunta

Quiero entender cómo se puede hacer esto? ¿Cómo puedo escribir una aplicación simple que va a capturar el volumen hacia arriba / hacia abajo presiona el botón. ¿Necesito tocar música en ese momento, o puedo hacer eso? Quiero decir, quizás la principal razón por la que Winamp y otras aplicaciones captan ese evento es que la música se reproduce en ese momento. O tal vez este problema no puede ser resuelto y si no puede ser resuelto quiero saber por qué? Necesito algunos argumentos por los que no se puede resolver.

Código fuente

He probado una cierta aplicación y aquí están los resultados, tengo que escribir una aplicación simple que captura volumen hacia arriba y hacia abajo presiona teclas en segundo plano y primer plano y también cuando la aplicación está en modo de sueño. Todo funciona perfectamente cuando la aplicación estaba en segundo plano y forground, mi aplicación de prueba captura eventos, pero cuando presiono un botón de encendido deja de hacer eso, luego presiono start en pleyer de medios y empieza a tocar música, después de presionar el botón de encendido De nuevo y luego presione el volumen hacia arriba y doun y mi aplicación de estadísticas de captura de volumen hacia arriba y hacia abajo keypresses . Significa que entonces la música se reproduce mi aplicación puede capturar que los eventos, por lo que mi siguiente pregunta cómo puedo simular como mi teléfono toca somem música? Puede ser esta es la solución?

Manifest.xml

<receiver android:name="com.vito.backgroundworker.VolumeBroadcast" android:enabled="true"> <intent-filter> <action android:name="android.media.VOLUME_CHANGED_ACTION" /> </intent-filter> </receiver> <receiver android:name="RemoteControlReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver> 

MainActivity.java

 public class MainActivity extends Activity { private PowerManager.WakeLock wl; //private BroadcastReceiver vol = new VolumeBroadcast(); private AudioManager mAudioManager; private ComponentName mRemoteControlResponder; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen"); mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); mRemoteControlResponder = new ComponentName(getPackageName(), RemoteControlReceiver.class.getName()); } @Override protected void onPause() { super.onPause(); mAudioManager.registerMediaButtonEventReceiver( mRemoteControlResponder); wl.release(); }//End of onPause @Override protected void onResume() { super.onResume(); wl.acquire(); }//End of onResume @Override public void onDestroy() { super.onDestroy(); mAudioManager.unregisterMediaButtonEventReceiver( mRemoteControlResponder); } } 

Eche un vistazo a registerMediaButtonEventReceiver () . Tienes que registrar tu aplicación como receptor de estos eventos para poder recibirlos.

Aquí hay algunos enlaces más que usted debe mirar:

Según mi experiencia, una aplicación no puede recibir transmisiones de botones de medios cuando el dispositivo está dormido, incluso si es un servicio de primer plano (el botón multimedia no lo activa). Mantener un bloqueo de velocímetro parcial evita que se duerma y se detecte la pulsación del botón. Sospecho que su música que juega la aplicación está sosteniendo un bloqueo de la estela que es porqué trabaja. Me gustaría ser probado mal y no necesita el bloqueo de la estela …

He encontrado una aplicación de código abierto que realmente despierta el teléfono de dormir pulsando el botón de volumen. https://github.com/praslnx8/volume_Screen_Lock

Esta aplicación utiliza Service para reproducir medios.

Durante la reproducción de medios, la acción del botón de volumen siempre se enviará al receptor respectivo, incluso si la pantalla del teléfono está bloqueada …

  • Toast no se mostrará antes de intentar / catch Thread.sleep ()
  • Confusión sobre el ciclo de vida de la actividad de Android
  • ¿Por qué mi aplicación Android salta los marcos cuando se llama a Thread.sleep?
  • Retardo de tiempo en Android
  • Cómo despertar el teléfono Android de dormir?
  • Android sleep () sin bloquear la interfaz de usuario
  • Acceso a la red cuando el teléfono Android está dormido
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.