我在 Text-to-Speech 应用程序中使用的用于处理来自耳机的媒体按钮的代码在 Android API 22 到 25 下运行良好(在旧版本的 Android 中,它们由其他现已贬值的方式处理)。然而,在 Android 8“Oreo”下,无论是公开测试版还是最终版本,它都不起作用。以下是相关代码:
当服务启动时,我创建 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”或我的代码有什么问题???我完全感到困惑。
2017 年 8 月 32 日更新
我还创建了一个简单但有效的应用程序项目来演示该问题,请参阅: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 上测试的几个音乐播放器应用程序中工作,我只是不知道它们做了什么不同的工作以使它们工作......我的应用程序的上下文不是播放音乐,而是用文本大声朗读文本到语音服务,因此音乐播放器示例中的许多代码不适用。