BroadcastReceiver pour ACTION_MEDIA_BUTTON ne fonctionne pas

J’écris une application Android pour la version 4.0.3 (ICS) du système d’exploitation Android. Le problème est que je ne reçois pas la sortie de mon Log.d () dans la méthode onReceive () de BroadcastReceiver, ce qui signifie que mon application ne gère pas correctement la diffusion.

J’ai lu d’innombrables questions sur la façon d’exécuter du code sur un ACTION_MEDIA_BUTTON en cliquant dessus. J’ai même copié + code collé lorsque le mien ne fonctionnait pas, juste pour voir si cela fonctionnerait.

Le bouton ACTION_MEDIA_BUTTON que je souhaite gérer est le bouton unique des écouteurs qui permet à un utilisateur de prendre / terminer des appels, de lire / mettre en pause de la musique. Au lieu que mon application gère ce bouton, lorsque je clique dessus, le lecteur de musique stock de mon Nexus S Android commence à lire une chanson .

Je n’ai pas placé mon code dans une autre classe, c’est peut-être pour cela que ça ne marche pas?

Voici le code trouvé dans la méthode onCreate () (ce code spécifique que j’ai copié sur un site Web après que le code que j’ai écrit ne fonctionnait pas):

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); 

Tout ce dont j’ai besoin de tester est KEYCODE_HEADSETHOOK mais cela ne fait pas de mal de disposer de l’autre code à des fins de test, je le corrigerai une fois que tout pourra fonctionner correctement.

Dans mon manifeste:

    

Au départ, je pensais que cela pouvait être un problème d’permissions car je n’avais spécifié d’permissions pour cela, mais je n’ai reçu aucun message d’erreur.

Comme je l’ai dit plus tôt, j’ai essayé de nombreuses variantes. Un exemple en était l’utilisation du code sur ce lien broadcastreceiver onReceive problem ACTION_MEDIA_BUTTON Android avec les corrections de CommonsWare . Encore une fois, je l’ai modifié pour ne pas être dans une classe séparée.

Merci d’avance pour votre aide.

J’ai testé cela sur un Samsung Galaxy S5 avec Android 4.4.2. Alors, qu’est-ce qui est important et ce qui n’est pas mentionné dans d’autres posts :

  • Enregistrez le récepteur dans le fichier AndroidManifest.xml à l’intérieur de la balise d’ application, mais en dehors de chaque balise d’ activité .
  • Votre récepteur Broadcastreceiver doit être public et statique
  • Une activité doit enregistrer un MediaButtonEventReceiver pour écouter les boutons pressés

Ok et voici un exemple de code :

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

Voici le récepteur :

 public static class YourBroadcastReceiver extends BroadcastReceiver{ // Constructor is mandatory public MediaBroadcastReceiver () { super (); } @Override public void onReceive(Context context, Intent intent) { Ssortingng intentAction = intent.getAction(); Log.i (TAG_MEDIA, intentAction.toSsortingng() + " 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 } } 

Et voici l’extrait de manifeste . Si nécessaire, ajoutez une priorité au filtre d’intention, mais ce n’était pas nécessaire pour moi:

        ...   

Pour les références:

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

Ce code lie votre bouton de casque à votre application et à votre application uniquement jusqu’à ce que vous appeliez:

 mAudioManager.unregisterMediaButtonEventReceiver(mediaButatonReceiver); 

Vous pouvez éviter d’utiliser Broacastreceiver pour Android> 5.0 (API LOLLIPOP de niveau 21) à l’aide de la MediaSession décrite ici: https://stackoverflow.com/a/39413753/1386969