在我的文本到语音应用程序中使用的用于处理媒体按钮的媒体按钮的代码在Android API 22到25中效果很好(在较旧版本的Android中,它们是由其他方式处理,现在贬值手段)。然而,在公开测试版和最终版本的Android 8“奥利奥”下,它不起作用。下面是相关代码:安卓“O”(奥利奥,8)媒体按钮问题
启动该服务时,我创建MediaSessionCompact对象:
mSession = new MediaSessionCompat(getApplicationContext(), "my.package.name._player_session");
mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mSession.setActive(true);
mSession.setCallback(myMediaSessionCallback);
PlaybackStateCompat state = new PlaybackStateCompat.Builder()
.setActions(ACTION_PLAY_PAUSE | ACTION_PLAY | ACTION_PAUSE |
ACTION_SKIP_TO_NEXT | ACTION_SKIP_TO_PREVIOUS |
ACTION_FAST_FORWARD | ACTION_REWIND
)
.setState(PlaybackStateCompat.STATE_PAUSED, 0 /*PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN*/, 1f)
.build();
mSession.setPlaybackState(state);
当然还有会话媒体回调的定义:
private MediaSessionCompat.Callback myMediaSessionCallback = new MediaSessionCompat.Callback() {
@Override
public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
// The log output below never appears on "Oreo", nothing comes here.
Log.d(TAG, "callback onMediaButtonEvent() Compat");
MediaButtonIntentReceiver.handleIntent(mediaButtonIntent.getAction(), (KeyEvent) mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT));
return true;
}
@Override
public void onSkipToNext() {
//...
}
// etc. other overrides
};
我也尝试过的PendingIntent,使用MediaButtonReceiver.buildMediaButtonPendingIntent()并为我感兴趣的所有操作设置mSession.setMediaButtonReceiver(pendingIntent),然后在我的服务onStartCommand()中调用MediaButtonReceiver.handleIntent(mSession,intent):
// still in the same service:
mSession.setMediaButtonReceiver(
MediaButtonReceiver.buildMediaButtonPendingIntent(
this,
mMediaButtonReceiverComponentName,
ACTION_PLAY));
mSession.setMediaButtonReceiver(
MediaButtonReceiver.buildMediaButtonPendingIntent(
this,
mMediaButtonReceiverComponentName,
ACTION_PAUSE));
mSession.setMediaButtonReceiver(
MediaButtonReceiver.buildMediaButtonPendingIntent(
this,
mMediaButtonReceiverComponentName,
ACTION_PLAY_PAUSE));
,并在服务onStartCommand():
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// ...
if (intent != null) {
MediaButtonReceiver.handleIntent(mSession, intent);
// ...
}
return START_NOT_STICKY;
}
没什么,它的多媒体按键按下的事件是完全愚蠢的。 “O”或我的代码有什么问题?我完全困惑。
更新8/32/2017
我还创建演示该问题微不足道,但工作程序项目,请参阅:https://github.com/gregko/PlayerServiceSample。当在Android 5.x至7.x的耳机上按媒体按钮时,此项目显示LogCat输出,但在Android 8“Oreo”下完全失败。
更新2017年9月1日 现在有在Android问题跟踪这件事,这是我提出的,在https://issuetracker.google.com/issues/65175978一个开放的问题。尽管媒体按钮可以在我用Oreo测试过的几个音乐播放器应用程序中工作,但我无法弄清楚它们的不同之处在于它们的工作方式不同......我的应用程序的上下文不是播放音乐,而是用文本朗读文本到语音服务,所以很多来自音乐播放器示例的代码都不适用。
因为我在发布赏金后不久就自行解决了这个问题,现在赏金应该被有效关闭。没有办法做到这一点,我可以看到,所以我们来看看会发生什么...... – gregko