2017-08-30 110 views
7

在我的文本到语音应用程序中使用的用于处理媒体按钮的媒体按钮的代码在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测试过的几个音乐播放器应用程序中工作,但我无法弄清楚它们的不同之处在于它们的工作方式不同......我的应用程序的上下文不是播放音乐,而是用文本朗读文本到语音服务,所以很多来自音乐播放器示例的代码都不适用。

+0

因为我在发布赏金后不久就自行解决了这个问题,现在赏金应该被有效关闭。没有办法做到这一点,我可以看到,所以我们来看看会发生什么...... – gregko

回答

4

已解决。在“Android 8.0 Behavior Changes”谷歌页面,我们发现这样的文字:

在安卓8.0(API级别26)的媒体按钮事件的处理是不同的:

  1. 的多媒体按键在UI活动的处理有没有改变:前台活动仍然在处理媒体按钮事件方面获得优先权。
  2. 如果前台活动不处理媒体按钮事件,则系统会将事件路由到最近在本地播放音频的应用程序。确定哪个应用程序接收媒体按钮事件时,不考虑媒体会话的活动状态,标志和播放状态。
  3. 如果应用的媒体会话已经发布,系统会将媒体按钮事件发送到应用的MediaButtonReceiver(如果有)。
  4. 对于其他每种情况,系统会丢弃媒体按钮事件。

我只需要做一些简单的示例工作就可以播放MediaPlayer的声音。显然,使用文本到语音API播放声音并不合格,在我看来这是一个错误。

这里是我加入到我的琐碎的示例代码,使其工作,打从原料资源目录中一个非常简短的和沉默的WAV文件:

final MediaPlayer mMediaPlayer; 
    mMediaPlayer = MediaPlayer.create(this, R.raw.silent_sound); 
    mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mediaPlayer) { 
      mMediaPlayer.release(); 
     } 
    }); 
    mMediaPlayer.start(); 

更新

提交的bug报告在https://issuetracker.google.com/issues/65344811

更新2,2017年10月10日

Android的问题跟踪器

谷歌现在说奥利奥在这方面的行为是“按设计”,并不会解决它。阅读上面的问题跟踪器帖子末尾的回复。我必须说我很失望。

+0

如果您关心在Android Oreo中解决此问题,请在Google问题跟踪器https:// issuetracker上的问题描述中添加明星。 google.com/issues/65344811 – gregko

+0

令人惊讶的是,这工作。许多高五给你。我希望他们解决这个问题。 – cottonBallPaws