MediaButtonReceiver无法使用MediaBrowserServiceCompat

时间:2016-07-07 13:41:27

标签: android headset android-mediasession

我正在尝试接收来自耳机或汽车控件(播放/暂停/等)的媒体按钮事件

这是在我的应用清单中。

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

这是我的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;
}

似乎我错过了一些东西。当我按下耳机控件上的暂停按钮时,永远不会调用onStartCommand。

知道为什么这不能按预期工作吗?

1 个答案:

答案 0 :(得分:7)

正如Best Practices in media playback I/O 2016 talk中所述,您还需要调用

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

在构建媒体会话时和开始播放之前,您必须根据其文档调用setActive(true)

  

您必须先将会话设置为活动状态,然后才能开始接收媒体按钮事件或传输命令。

请注意,您还必须在call setActions() PlaybackStateCompat.Builder上准确说出您支持的操作 - 如果您没有设置,那么您将无法获得与媒体按钮相关的任何回调。