我目前正在开发具有视频和音频功能的应用程序的一部分,并且最近开始重构代码库。目标是集成MediaSession/ MediaController
和MediaBrowserService/ MediaBrowser
框架。
我们对视频和音频组件使用ExoPlayer
更PlayerControlView
具体的PlayerView,它需要对播放器实例的引用PlayerControlView
:
/**
* Sets the {@link Player} to control.
*
* @param player The {@link Player} to control, or {@code null} to detach the current player. Only
* players which are accessed on the main thread are supported ({@code
* player.getApplicationLooper() == Looper.getMainLooper()}).
*/
public void setPlayer(@Nullable Player player) {...
但是,根据android 开发人员的帖子和 的文档,MediaBrowserService
播放器实例应该包含在服务下。此外,客户端站点(MediaBrowser 和 MediaController)通过connect()
方法和MediaBrowserConnectionCallback与之交谈的唯一方法,这使得将播放器的实例传递给 PlayerControlView(或其他方式)是不可能的。
我尝试使用各种回调,例如MediaSessionCompat.Callback,但SimpleExoPlayer或PlayerControlView都不是 Parcelable。
在传统的服务中,我们Binder
用来访问我们在服务中声明的方法并执行以下操作:
boolean attachPlayerControlView(PlayerControlView playerControlView) {
if (player != null) {
playerControlView.setPlayer(player);
return true;
}
return false;
}
MediaBrowserService/ MediaBrowser
但是,这对于框架来说似乎是不可能的。我检查了这个问题的答案,这表明使用 [sendCommand] 是一种调用自定义方法的方式。但它也要求参数是 Parcelable 的。
总而言之,我的问题是,有没有办法在框架下PlayerControlView
访问实例SimpleExoPlayer
或其他方式。MediaBrowserService
非常感谢您的任何回答或评论。