首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MediaBrowserService与ExoPlayer和PlayerControlView -如何从UI (PlayerControlView)访问player实例?

MediaBrowserService与ExoPlayer和PlayerControlView -如何从UI (PlayerControlView)访问player实例?
EN

Stack Overflow用户
提问于 2020-04-03 18:05:08
回答 1查看 1.2K关注 0票数 12

我目前正在开发一个具有视频和音频功能的应用程序的一部分,并且最近开始重构代码库。目标是集成MediaSession/ MediaControllerMediaBrowserService/ MediaBrowser框架。

我们更具体地使用ExoPlayerPlayerControlView,即视频和音频组件的PlayerView,它需要对PlayerControlView的player实例的引用。

代码语言:javascript
复制
/**
   * 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开发者发帖文档 of MediaBrowserService下,player实例应该包含在服务下面。此外,客户端站点(MediaBrowser和MediaController)通过connect()方法和MediaBrowserConnectionCallback进行服务的唯一方法,这使得将播放机的实例传递给PlayerControlView (或者反过来)是不可能的。

我尝试过使用各种回调,比如MediaSessionCompat.Callback,但是SimpleExoPlayerPlayerControlView都不是Parcelable的。

在传统服务中,我们使用Binder访问在服务中声明的方法,并执行如下操作:

代码语言:javascript
复制
boolean attachPlayerControlView(PlayerControlView playerControlView) {
            if (player != null) {
                playerControlView.setPlayer(player);
                return true;
            }
            return false;
        }

然而,在MediaBrowserService/ MediaBrowser框架中,这似乎是不可能的。我检查了这个问题的答案,这表明使用sendCommand是调用自定义方法的一种方法。但它也要求参数必须是Parcelable。

总之,我的问题是,是否有一种方法可以让PlayerControlView访问SimpleExoPlayer实例,或者在MediaBrowserService框架下有相反的方式。

非常感谢您的回答或评论。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-17 15:19:44

此外,客户端站点(MediaBrowser和MediaController)通过connect()方法和MediaBrowserConnectionCallback进行服务的唯一方法,使得无法将播放器的实例传递给PlayerControlView (或相反的方法)。

根据我的理解,这是不对的。您可以始终以传统方式绑定到MediaBrowserService,即使用IBinder访问服务。(虽然我不确定这是否是正确的方法,否则我必须在服务中创建一个静态MediaPlayer实例)。

我遇到了一个类似的问题,使用MediaPlayer的视频播放。我已经使用MediaBrowserService绑定到IBinder,然后获取MediaPlayer实例。在您的服务中,提供返回对MediaPlayer的引用的方法。就像这样:

代码语言:javascript
复制
private MediaPlayer mediaPlayer;

@Override
public IBinder onBind(Intent intent) {
    if (intent.getAction().equals("YOUR_INTENT")) {
        return new LocalBinder();
    }
    return super.onBind(intent);
}

public class LocalBinder extends Binder{
    public AudioService getService(){
        return AudioService.this;
    }
}

public MediaPlayer getMediaPlayer() {
    return mediaPlayer;
}

在您的活动/片段中,然后使用MediaBrowserService绑定到IBinder。在我的实现中,我使用了MediaPlayer,但我认为它可以以类似的方式用于Exoplayer。

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback{

private MediaPlayer mediaPlayer;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private boolean isServiceBounded;
private boolean isSurfaceReady;

private ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        isServiceBounded = true;
        mediaPlayer = ((AudioService)service).getMediaPlayer();
        if (isSurfaceReady) {
            mediaPlayer.setDisplay(surfaceHolder);
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        isServiceBounded = false;
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    surfaceView = findViewById(R.id.surfaceView);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(this);
    bindService(new Intent("YOUR_INTENT"), serviceConnection, BIND_AUTO_CREATE);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    surfaceHolder = holder;
    isSurfaceReady = true;
    if (mediaPlayer != null) {
        mediaPlayer.setDisplay(holder);
    }
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    isSurfaceReady = false;
    if (mediaPlayer != null) {
        mediaPlayer.setDisplay(null);
    }
    surfaceHolder = null;
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unbindService(serviceConnection);
}

}

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61017893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档