2012-11-06 6 views
11

Ziel ist es, Broadcasts vom Headset abzufangen, sowie Bluetooth, um auf verschiedene Arten von Klicks vom Headset zu reagieren, um den Mediaplayer zu ändern. Diese Lösung eignet sich für alle Versionen vor ICS. Hier ist ein Teil des Codes und Dinge, die ich versucht habe:MediaButtonIntentReceiver funktioniert nicht in Android 4.0+

.... 
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(); 
    } 
} 

Um zu versuchen, diese Arbeit zu machen, es klingt wie 4.0+ erfordert dies so etwas wie die Arbeit des Ball hielt:

((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(this, MediaButtonIntentReceiver.class)); 

Ich habe sogar versucht zu fügen sie es das Manifest, zusätzlich zu dem oben:

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

Noch kein Glück. Was fehlt mir hier? Es ist sicherlich ein 4.0 +/ICS/JellyBean-Problem ... Dies wird in einem Service gemacht, keine Aktivität.

+0

Ich fand auch, dass dies der Grund in Android Core ist, aber keine Lösung zu umgehen: http://code.google.com/p/media-button-router/issues/detail?id=10#c4 – Du3

Antwort

10

Es sieht so aus, als ob Ihr Rundfunkempfänger eine innere Klasse für Sie ist? Wenn ja, machen Sie Ihren Rundfunkempfänger statisch und im Manifest dies zu tun:

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

In Android 3.0+ Sie registerMediaButtonEventReceiver verwenden müssen, um den Empfänger zu registrieren. Dies verwendet das AndroidManifest für den IntentFilter. Der Grund, warum es in 2.x funktioniert, ist, dass Sie es mit this.registerReceiver() registriert haben, das den Empfänger ohne das AndroidManifest registriert hat.

+3

Die einzige Rechtfertigung für mich, eine innere Klasse zu verwenden, besteht darin, auf Methoden der äußeren Klasse zugreifen zu können, aber wenn die innere Klasse statisch gemacht wird, kann ich nicht auf diese Methoden zugreifen. [Catch 22] (http://stackoverflow.com/questions/15058743/how-do-i-register-in-manifest-an-inner-media-button-broadcastreciver#comment21174031_15058783). Vorschlag? – an00b

+0

@ an00b Wir verwenden Greenrobots EventBus als eine einfache Möglichkeit, zwischen Komponenten zu kommunizieren (http://greenrobot.org/eventbus/documentation/). Z.B. Der statische BroadcastReceiver veröffentlicht ein Ereignis, das von der Aktivität abonniert wird. Ideal zum Entkoppeln –

1

Versuchen Sie einfach auf Gelee auf diese ist für mich arbeiten:

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

Absichten:

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

-Test aus dem Dienst mit Medien-Taste von Widgetsoid (die BT-Media-Tasten emulieren). Alles funktioniert.

+0

Wenn ich die Media-Taste drücke und halte, übernimmt Google Apps es immer noch. Ich fügte der Absicht sogar die maximale Priorität hinzu. Ich habe Ihren Snippit Code in der OnCreate-Funktion hinzugefügt. Gibt es noch andere Orte, die ich definieren muss, wie im Manifest über die Absicht? Wie ich schon sagte, das funktioniert gut auf Android-Geräten vor 4.0 – Du3

+0

Haben Sie auf einem echten Gerät getestet? oder Emulator? Mein Code funktioniert nicht für dich? Ursache Arbeit für mich auf Galaxy Nexus mit Android 4.2. Normalerweise ist Absicht auf manifest oder in Code, wie ich es dir gebe, aber es gibt keine anderen Orte. – jaumard

+0

Getestet auf Galaxy S3 mit 4.1.1. Ich habe alles oben genannte versucht. Ihr Code funktioniert auf 2.3.6 – Du3

Verwandte Themen