gpt4 book ai didi

android - 带有 ExoPlayer 和 PlayerControlView 的 MediaBrowserService - 如何从 UI (PlayerControlView) 访问播放器实例?

转载 作者:行者123 更新时间:2023-12-02 11:20:13 26 4
gpt4 key购买 nike

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

我们使用 ExoPlayerPlayerControlView更具体地说,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 developers post 下和 documentationMediaBrowserService ,播放器实例应包含在服务下。此外,客户端站点(MediaBrowser 和 MediaController)通过 connect()方法和 MediaBrowserConnectionCallback ,这使得将播放器的实例传递给 PlayerControlView (或相反)是不可能的。

我尝试过使用各种回调,例如 MediaSessionCompat.Callback ,但 SimpleExoPlayer 都不是或 PlayerControlView是可包裹的。

在传统服务中,我们使用 Binder访问我们在服务中声明的方法并执行以下操作:
boolean attachPlayerControlView(PlayerControlView playerControlView) {
if (player != null) {
playerControlView.setPlayer(player);
return true;
}
return false;
}

但是,使用 MediaBrowserService/ MediaBrowser 似乎是不可能的。框架。我检查了这个 question 的答案,表示使用 [sendCommand] 是一种调用自定义方法的方式。但它也要求参数是 Parcelable 的。

总而言之,我的问题是,有没有办法让 PlayerControlView访问 SimpleExoPlayer 的实例或在 MediaBrowserService 下反之框架。

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

最佳答案

In addition, the only way for the client site (MediaBrowser and MediaController) to talk to service it through the connect() method and MediaBrowserConnectionCallback, which makes passing the instance of the player to the PlayerControlView (or the other way around) not possible.


根据我的理解,这是不正确的。你总是可以绑定(bind)到
MediaBrowserService 以传统方式,即使用 IBinder 访问 Service。 (虽然我不确定这是否是正确的方法,否则我必须在 Service 中创建一个静态 MediaPlayer 实例)。
我在使用 MediaPlayer 进行视频播放时遇到了类似的问题。我已经使用 IBinder 绑定(bind)到 MediaBrowserService,然后获取了 MediaPlayer 实例。在您的服务中提供一个返回对 MediaPlayer 的引用的方法。像这样的东西:
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;
}
在您的 Activity/Fragment 中,然后使用 IBinder 绑定(bind)到 MediaBrowserService。在我的实现中,我使用了 MediaPlayer,但我认为它可以以类似的方式用于 Exoplayer。
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);
}
}

关于android - 带有 ExoPlayer 和 PlayerControlView 的 MediaBrowserService - 如何从 UI (PlayerControlView) 访问播放器实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61017893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com