Java 在服务中接收媒体密钥事件

Java 在服务中接收媒体密钥事件,java,android,Java,Android,我知道这已经解释了一百次了,我已经看了所有的,但仍然无法理解。我在BlackBerry 10 QT/C++上有经验,但我正在尝试乘坐BlackBerry列车进入Android,这意味着学习Java和Android的做事方式 我(在其他向导中)正在跟随 在AndroidManifest.xml中 <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="

我知道这已经解释了一百次了,我已经看了所有的,但仍然无法理解。我在BlackBerry 10 QT/C++上有经验,但我正在尝试乘坐BlackBerry列车进入Android,这意味着学习Java和Android的做事方式

我(在其他向导中)正在跟随

在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>
任何帮助都会很好

谢谢

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

和onStartCommand()以: MediaButtonReceiver.HandleContent(mediaSessionCompat,intent)


但是仍然没有Log.d()关于按下任何媒体键,我观看了视频,它帮助我理解了它,但没有了解问题是什么,顺便说一下,我在API 22(5.1.1)上。

首先,您缺少一些东西:

  • 您需要将android.intent.action.MEDIA_按钮的
    添加到您的
    .myService
    -没有此功能,
    MediaButtonReceiver
    将不知道将媒体按钮转发到哪个服务
  • 你需要打电话来
之后,您的服务将正确设置,但您仍然不会收到媒体按钮。如中所述,您需要通过呼叫成为首选的媒体按钮接收器

你还需要确认你正在打电话

mediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
  MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mediaSessionCompat.setCallback(mediaSessionCompatCallBack);
这可以确保您说您可以处理媒体按钮并向MediaSessionCompat注册回调实例


请注意,
MediaSessionCompat
将自动将媒体按钮转换为相应的回调方法(即,play将转换为调用的
onPlay()
等),因此在许多情况下,您不需要直接覆盖
onMediaButtonEvent()

谢谢您的帮助,我有了MediaButtonReceiver.HandleContent(mediaSessionCompat,intent);在我的onStartCommand()中,我还有mediaSessionCompat.setActive(true);我添加了intent过滤器和其他媒体传输标志,我确实需要重载按钮,因为我想让一些自定义内容继续进行……仍然无法获取日志。d()然后,只要您启动一次服务并添加
,它就应该可以工作。正如谈话中所解释的,通常您可以
设置活动(true)
当您开始播放媒体时。我用我所做的更改编辑了原始帖子,这在BlackBerry 10上容易多了哈哈。我不确定我在这里遗漏了什么…@IWIK-您是否也将
添加到
.myService
?您是如何触发媒体按钮的?
MediaButtonReceiver
打印出一条错误消息,如果它找不到可将媒体按钮转发到的服务。我只是将播放/暂停音量调高,将音量调低。我发现我确实收到了一个日志。d()如果我连接耳机并在那里按媒体按钮,我是否在错误的位置查找音量和播放/暂停事件?别忘了调用
mediaSessionCompat.release()
onDestroy()
中清理连接。您没有描述、发生了什么错误、出现了什么错误、实际情况和预期行为等。唯一的问题是您的清单是否正确。对不起,我没有获得任何播放/暂停或音量控制的Log.d()
    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);
        }
    });
    mediaSessionCompat.setActive(true);

    return super.onStartCommand(intent, flags, startId);
mediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
  MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mediaSessionCompat.setCallback(mediaSessionCompatCallBack);