Android Mediasession多次设置MetaData后不回调MediaControllerCompat.Callback()中onMetadataChanged方法

我在测试我的应用的时候,通过长时间快速点击上下一曲按钮,我发现Mediasession不会回调MediaControllerCompat.Callback()中onMetadataChanged方法。
目前已经确定问题出在mediasession.setMetadata方法上,要如何去解决这个问题呢?

mediasession.setMetadata方法源码截图:

img

这是一个MediaSession和MediaController的bug。你需要在每次调用setMetadata后手动调用notifyChange()通知MediaController有变更。
可以这样修改:
java
mediasession.setMetadata(...);
mediasession.sendSessionEvent(MediaSession.SESSION_EVENT_METADATA_CHANGED);
sendSessionEvent()方法会调用notifyChange()通知MediaController有变更,从而触发onMetadataChanged回调。
修改后,MediaController就能正确监听到MediaSession的Metadata变更,并调用onMetadataChanged()了。
可能的原因是:

  1. MediaSession默认是lazy notify的,只有在有SET/GET操作时才会 notify,而单纯调用setMetadata不会触发notify。
  2. MediaSession内部maintains a dirty flag来触发notify,但setMetadata不会设置这个dirty flag。
    所以需要主动调用sendSessionEvent()手动触发notify,解决这个bug。