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