簡體   English   中英

帶有 ExoPlayer 和 PlayerControlView 的 MediaBrowserService - 如何從 UI (PlayerControlView) 訪問播放器實例?

[英]MediaBrowserService with ExoPlayer and PlayerControlView - How to access to the player instance from the UI (PlayerControlView)?

我目前正在開發具有視頻和音頻功能的應用程序的一部分,並且最近開始重構代碼庫。 目標是整合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 開發人員帖子MediaBrowserService文檔下,播放器實例應包含在服務下。 此外,客戶端站點(MediaBrowser 和 MediaController)通過connect()方法和MediaBrowserConnectionCallback與之交談的唯一方法,這使得將播放器的實例傳遞給 PlayerControlView(或其他方式)是不可能的。

我嘗試使用各種回調,例如MediaSessionCompat.Callback ,但SimpleExoPlayerPlayerControlView都不是 Parcelable。

在傳統服務中,我們使用Binder來訪問我們在服務中聲明的方法,並執行以下操作:

boolean attachPlayerControlView(PlayerControlView playerControlView) {
            if (player != null) {
                playerControlView.setPlayer(player);
                return true;
            }
            return false;
        }

但是,對於MediaBrowserService/ MediaBrowser框架來說,這似乎是不可能的。 我檢查了這個問題的答案,這表明使用 [sendCommand] 是一種調用自定義方法的方式。 但它也要求參數是 Parcelable 的。

總而言之,我的問題是,有沒有辦法讓PlayerControlView訪問SimpleExoPlayer的實例,或者在MediaBrowserService框架下以其他方式訪問。

非常感謝您的任何回答或評論。

此外,客戶端站點(MediaBrowser 和 MediaController)通過 connect() 方法和 MediaBrowserConnectionCallback 與之交談的唯一方法,這使得將播放器的實例傳遞給 PlayerControlView(或其他方式)是不可能的。

根據我的理解,這是不正確的。 您始終可以以傳統方式綁定到 MediaBrowserService,即使用 IBinder 訪問服務。 (雖然我不確定這是否是正確的方法,否則我必須在服務中創建一個 static MediaPlayer 實例)。

我在使用 MediaPlayer 進行視頻播放時遇到了類似的問題。 我已經使用 IBinder 綁定到 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 綁定到 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);
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM