2016-07-07 21 views
2

Ich versuche, Medientaste Ereignisse von Headsets oder Auto Kontrollen (Wiedergabe/Pause/etc.)MediaButtonReceiver arbeitet nicht mit MediaBrowserServiceCompat

Dies ist in meinem App-Manifest zu erhalten.

<service android:name=".mediaPlayerService.MediaPlayerService" 
     android:exported="true"> 
    <intent-filter> 
     <action android:name="android.media.browse.MediaBrowserService"/> 
    </intent-filter> 
</service> 

<!-- 
A receiver that will receive media buttons and send as 
intents to your MediaBrowserServiceCompat implementation. 
Required on pre-Lollipop. More information at 
http://developer.android.com/reference/android/support/v4/media/session/MediaButtonReceiver.html 
--> 
<receiver android:name="android.support.v4.media.session.MediaButtonReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.MEDIA_BUTTON"/> 
    </intent-filter> 
</receiver> 

Dies ist Teil meiner MediaPlayerService

public class MediaPlayerService extends MediaBrowserServiceCompat { 

@Override 
public void onCreate() 
{ 
    super.onCreate(); 
    initMediaSessions(); 
} 

private void initMediaSessions() 
{ 
    mSession = new MediaSessionCompat(getApplicationContext(), MediaPlayerService.class.getSimpleName()); 
    setSessionToken(mSession.getSessionToken()); 

    mSession.setCallback(new MediaSessionCompat.Callback() 
         { 
          //callback code is here.  
         }    
    ); 
} 

@Override 
public int onStartCommand(Intent startIntent, int flags, int startId) 
{ 
    if (startIntent != null) 
    { 
     // Try to handle the intent as a media button event wrapped by MediaButtonReceiver 
     MediaButtonReceiver.handleIntent(mSession, startIntent); 
    } 
    return START_STICKY; 
} 

Es scheint, wie ich etwas fehle. Wenn ich die Pause-Taste an meinen Headset-Steuerelementen drücke, wird der onStartCommand nie aufgerufen.

Eine Idee, warum dies nicht wie erwartet funktioniert?

Antwort

3

Wie in der Best Practices in media playback I/O 2016 talk, müssen Sie auch

mSession.setFlags(
    MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | 
    MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); 

rufen, wenn Sie Ihre Medien-Sitzung aufzubauen und bevor Sie die Wiedergabe starten, müssen Sie setActive(true) gemäß seiner Dokumentation nennen:

Sie Sie müssen die Sitzung aktivieren, bevor sie Media-Button-Ereignisse oder Transportbefehle empfangen kann.

Beachten Sie, dass Sie müssen auch call setActions() auf Ihrem PlaybackStateCompat.Builder genau sagen, welche Maßnahmen Sie unterstützen - in Bezug auf Medien-Tasten, wenn Sie nicht festlegen, dass dann werden Sie keine der Rückrufe erhalten.

+0

Die Einstellung der Aktionen klingt nicht plausibel. Ich werde das überprüfen. – Hackmodford

+0

Ich habe das Einstellen der Aktionen verpasst. Flags waren automatisch, weil ich MediaBrowserCompat benutze Vielen Dank! – Hackmodford

+0

Ich bin mir nicht sicher, was Sie unter "Flaggen waren automatisch" verstehen. Wenn Sie 'setFlags()' nicht aufrufen, gibt es sicherlich Probleme (insbesondere beim Empfang von Medien-Buttons auf ianhanniballake