MediaButtonIntentReceiver ne fonctionne pas dans Android 4.0+

Le but est d'intercepter les émissions du casque, ainsi que le bluetooth éventuellement, pour répondre aux différents types de clics du casque pour modifier le mediaplayer. Cette solution fonctionne bien pour toutes les versions antérieures à ICS. Voici le code et les choses que j'ai essayé:

.... private BroadcastReceiver mediaButtonReceiver = new MediaButtonIntentReceiver(); .... public void onCreate() { ... IntentFilter mediaFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); mediaFilter.setPriority(2147483647); // this is bad...I know this.registerReceiver(mediaButtonReceiver, mediaFilter); ... } public class MediaButtonIntentReceiver extends BroadcastReceiver { private KeyEvent event; public MediaButtonIntentReceiver() { super(); } @Override public void onReceive(Context context, Intent intent) { String intentAction = intent.getAction(); if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { return; } event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if (event == null) { return; } try { int action = event.getAction(); switch(action) { case KeyEvent.ACTION_UP : Log.d("TEST", "BUTTON UP"); break; case KeyEvent.ACTION_DOWN : case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE : Log.d("TEST", "BUTTON DOWN"); break; } } catch (Exception e) { Log.d("TEST", "THIS IS NOT GOOD"); } abortBroadcast(); } } 

Pour essayer de faire fonctionner, cela ressemble à 4.0+ nécessite quelque chose comme ça qui n'a pas fonctionné:

  • Android Studio: "Sélectionnez Android SDK"
  • Geler ou faire une vue stable sur le Web lorsque je sélectionne la barre d'action Retour? Empêchez la chargement / rechargement à chaque fois
  • Application de crash Android après proguard
  • Obtenir APK de l'application installée
  • Existe-t-il un moyen d'empêcher la liste de défiler jusqu'à sa position supérieure lorsque les données de son adaptateur sont modifiées?
  • Google Play APK et Android Studio APK (USB debug) se comportent différemment
  •  ((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(this, MediaButtonIntentReceiver.class)); 

    J'ai même essayé de l'ajouter au manifeste, en plus de ce qui précède:

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

    Toujours pas de chance. Qu'est-ce que j'oublie ici? C'est certainement un problème 4.0 + / ICS / JellyBean … Cela se fait dans un service, pas une activité.

  • Comment calculer la distance entre deux emplacements en utilisant leur longitude et leur latitude
  • Expansion bouton bouton flottant
  • J'ai besoin de changer la couleur de la course à une couleur définie par l'utilisateur. Rien à voir avec l'état
  • Android fait des numéros de téléphone cliquables, détection automatique
  • Ffmpeg pour un android (en utilisant le didacticiel: "ffmpeg and Android.mk")
  • Android - Tout ce qui ressemble à l'iPhone SDK délègue les retours de rappel?
  • 2 Solutions collect form web for “MediaButtonIntentReceiver ne fonctionne pas dans Android 4.0+”

    Il semble que votre récepteur de diffusion est une classe intérieure à votre service? Si c'est le cas, rendez votre récepteur de diffusion statique et, dans le manifeste, procédez comme suit:

     <receiver android:name="MyOuterClass$MediaButtonIntentReceiver" android:enabled="true"> <intent-filter android:priority="2147483647" > <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver> 

    Dans Android 3.0+, vous devez utiliser registerMediaButtonEventReceiver pour enregistrer le récepteur. Cela utilise l'AndroidManifest pour IntentFilter. La raison pour laquelle il fonctionne dans 2.x est parce que vous l'enregistrez avec this.registerReceiver() qui a enregistré le destinataire sans AndroidManifest.

    Essayez juste de gelée, cela fonctionne pour moi:

      broadcastReceiver = new BroadcastReceiver() {//global BroadcastReceiver @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(action.equals("android.intent.action.MEDIA_BUTTON")){ Log.e("test", "ok"); } }; 

    Intention :

      IntentFilter intentfilterTime = null; intentfilterTime = new IntentFilter(); intentfilterTime.addAction("android.intent.action.MEDIA_BUTTON"); registerReceiver(broadcastReceiver, intentfilterTime); 

    Test du service avec le bouton multimédia de Widgetsoid (qui imitent les boutons multimédia BT). Tout fonctionne.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.