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é:

  • Comment mettre un "-" dans le fichier string.xml
  • Emulateur Android "émulateur: ERREUR: l'image de données utilisateur est utilisée par un autre émulateur. Avorter "
  • VectorDrawableCompat Resources $ NotFoundException sur KitKat et ci-dessous
  • Android gradle buildTypes: classe en double
  • Test de ce bouton démarre une activité avec Robolectric
  • Vertical DrawerLayout ou SlidingPaneLayout
  •  ((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é.

  • Android - passez à l'écran des paramètres
  • ZXing comment numériser QR-Code et code barre 1D?
  • Configuration de la base de travail sur Android
  • Définir textSize par programme
  • Lecture d'un fichier texte simple
  • Utilisation de getSpectrum () dans la bibliothèque Libgdx
  • 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.