在服务中接收媒体键事件

时间:2016-01-11 23:27:07

标签: java android

我知道它已被解释了一百次,而且我已经看过它们但仍然无法弄明白。我有使用BlackBerry 10 QT / C ++的经验,但我正试图将黑莓列车带入Android,这意味着要学习Java和Android的做事方式。

我正在关注(以及其他指南)this one

AndroidManifest.xml中的

<application

android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service android:enabled="true" android:name=".myService" >
    </service>
    <receiver android:name="android.support.v4.media.session.MediaButtonReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>
</application>

我认为我有需要的东西?否?

在myService.java

public class myService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

private MediaSessionCompat.Callback mediaSessionCompatCallBack = new MediaSessionCompat.Callback()
{
    @Override
    public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
        Log.d("MEDIAKEY", "Key Event");

        return super.onMediaButtonEvent(mediaButtonEvent);
    }
};

private MediaSessionCompat mediaSessionCompat;


@Override
public void onCreate() {
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
    Log.d("SERVICE", "onCreate");

    mediaSessionCompat = new MediaSessionCompat(this, "MEDIA");


}

@Override
public void onDestroy() {
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
    Log.d("SERVICE", "onDestroy");

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
    Log.d("SERVICE_STARTUP", "onStart");

    mediaSessionCompat.setCallback(mediaSessionCompatCallBack);

    mediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS);


    MediaButtonReceiver.handleIntent(mediaSessionCompat, intent);

    mediaSessionCompat.setActive(true);


    return START_STICKY;
}

任何帮助都会很棒,

由于

编辑: 好的,我已将onCreate()更改为:

    context = getApplicationContext();

    mediaSessionCompat = new MediaSessionCompat(context, "MEDIA");

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

    mediaSessionCompat.setCallback(new MediaSessionCompat.Callback() {
        @Override
        public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
            Log.d("MEDIA", "event");

            return super.onMediaButtonEvent(mediaButtonEvent);
        }
    });

和onStartCommand():         MediaButtonReceiver.handleIntent(mediaSessionCompat,intent);

    mediaSessionCompat.setActive(true);

    return super.onStartCommand(intent, flags, startId);

但是在按任何媒体键时仍然没有Log.d(),我观看视频并且它帮助我理解它但没有解决问题,我在API 22(5.1.1)上方式。

1 个答案:

答案 0 :(得分:2)

首先缺少MediaButtonReceiver documentation中的一些内容:

  • 您需要将<intent-filter> android.intent.action.MEDIA_BUTTON添加到.myService - 如果没有这个,MediaButtonReceiver将无法知道将媒体按钮转发到哪个服务
  • 您需要在handleIntent()
  • 中致电onStartCommand()

之后,您的服务将正确设置,但您仍然无法接收媒体按钮。正如Media Playback the Right Way talk中所述,您需要通过调用mediaSessionCompat.setActive(true)成为首选的媒体按钮接收器。

您还需要确保拨打电话

mediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
  MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mediaSessionCompat.setCallback(mediaSessionCompatCallBack);

这可确保您说您可以处理媒体按钮并使用MediaSessionCompat注册您的Callback实例。

请注意,MediaSessionCompat会自动将媒体按钮转换为相应的回调方法(即,播放将转换为被调用的onPlay()等),因此在许多情况下,您无需直接覆盖{ {1}}。