tutorial studio start sendbroadcast registerreceiver oreo intent example date_changed java android android-intent broadcastreceiver

java - studio - BroadcastReceiver para ACTION_MEDIA_BUTTON no funciona



start broadcast receiver android (3)

Estoy escribiendo una aplicación de Android para la versión 4.0.3 (ICS) del sistema operativo Android. El problema es que no obtengo el resultado de mi Log.d () en el método onReceive () de BroadcastReceiver, lo que significa que mi aplicación no está manejando correctamente la transmisión.

He leído innumerables preguntas sobre cómo ejecutar código cuando se hace clic en ACTION_MEDIA_BUTTON. Incluso he copiado y pegado el código cuando el mío no funcionó, solo para ver si funcionaba.

El ACTION_MEDIA_BUTTON que deseo manejar es el botón individual en los auriculares que permiten al usuario capturar / finalizar llamadas, reproducir / pausar música. En lugar de que mi aplicación maneje este botón, cuando hago clic en él, el reproductor de música en stock de mi Nexus S Android comienza a reproducir una canción .

No he colocado mi código en otra clase, ¿quizás es por eso que no funciona?

Aquí está el código encontrado en el método onCreate () (este código específico que copié de un sitio web después de que el código que escribí no funcionó):

IntentFilter mediaButtonFilter = new IntentFilter( Intent.ACTION_MEDIA_BUTTON); mediaButtonFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); BroadcastReceiver brMediaButton = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { Log.d("Event", "Media button!"); this.abortBroadcast(); KeyEvent key = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if(key.getAction() == KeyEvent.ACTION_UP) { int keycode = key.getKeyCode(); if(keycode == KeyEvent.KEYCODE_MEDIA_NEXT) { Log.d("TestApp", "Next Pressed"); } else if(keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) { Log.d("TestApp", "Previous pressed"); } else if(keycode == KeyEvent.KEYCODE_HEADSETHOOK) { Log.d("TestApp", "Head Set Hook pressed"); } } } }; registerReceiver(brMediaButton, mediaButtonFilter);

Todo lo que necesito probar es KEYCODE_HEADSETHOOK, pero no hace daño tener el otro código allí para probar, lo arreglaré una vez que pueda hacer que todo funcione correctamente.

En mi manifiesto:

<intent-filter android:priority="2147483647" > <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter>

Originalmente pensé que esto podría ser un problema de permisos ya que no especifiqué ningún permiso para esto, sin embargo, no recibí ningún mensaje de error.

Como dije antes, he intentado muchas variaciones de esto. Un ejemplo fue el uso del código en este enlace receptor de radio en el problema de recepción ACTION_MEDIA_BUTTON Android con las correcciones de CommonsWare. De nuevo, sin embargo, lo modifiqué para que no estuviera en una clase separada.

Gracias de antemano por su ayuda.


mediaButtonReceiver = new ComponentName(getPackageName(), MediaButtonReceiver.class.getName()); mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); mAudioManager.registerMediaButtonEventReceiver(mediaButatonReceiver);

Este código vinculará el botón de los auriculares a su aplicación y a su aplicación solo hasta que llame:

mAudioManager.unregisterMediaButtonEventReceiver(mediaButatonReceiver);


Probé esto en un Samsung Galaxy S5 con Android 4.4.2. Entonces, ¿qué es importante y qué no se menciona en otras publicaciones ?

  • Registre el receptor en AndroidManifest.xml dentro de la etiqueta de la aplicación pero fuera de cada etiqueta de actividad .
  • Su receptor Broadcastreceiver debe ser público y estático
  • Una actividad necesita registrar un MediaButtonEventReceiver para escuchar las pulsaciones de los botones

De acuerdo y aquí un código de ejemplo :

mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mReceiverComponent = new ComponentName(this,YourBroadcastReceiver.class); ... mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent); ... // somewhere else mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent);

Aquí el receptor :

public static class YourBroadcastReceiver extends BroadcastReceiver{ // Constructor is mandatory public MediaBroadcastReceiver () { super (); } @Override public void onReceive(Context context, Intent intent) { String intentAction = intent.getAction(); Log.i (TAG_MEDIA, intentAction.toString() + " happended"); if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { Log.i (TAG_MEDIA, "no media button information"); return; } KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if (event == null) { Log.i (TAG_MEDIA, "no keypress"); return; } // other stuff you want to do } }

Y aquí el fragmento de manifiesto . Si es necesario, agregue prioridad para el filtro de intención, pero no fue necesario para mí:

<application> <receiver android:name="OuterClass$YourBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver> <activity> ... </activity> </application>

Para las referencias:


Puede evitar utilizar el Broacastreceiver para Android> 5.0 (API nivel 21 LOLLIPOP) utilizando la MediaSession que se describe aquí: https://.com/a/39413753/1386969