【Audio&Video】构建媒体浏览器客户端(7)


要完成客户端/服务器设计,您必须构建一个包含UI代码,关联的MediaController和MediaBrowser的活动组件。

MediaBrowser执行两个重要功能:连接到MediaBrowserService,并在连接时为您的UI创建MediaController。

注意: MediaBrowser的推荐实现是Media-Compat支持库中MediaBrowserCompat定义的 。在整个这个页面中,术语“MediaBrowser”是指MediaBrowserCompat的一个实例。

连接到MediaBrowserService


当您的客户端活动被创建时,它会连接到MediaBrowserService。有一点涉及握手和舞蹈。修改活动的生命周期回调,如下所示:

onCreate()构造一个MediaBrowserCompat。传入您已定义的MediaBrowserService和MediaBrowserCompat.ConnectionCallback的名称。
onStart()连接到MediaBrowserService。这就是MediaBrowserCompat.ConnectionCallback的魅力所在。如果连接成功,onConnect()回调将创建媒体控制器,将其链接到媒体会话,将您的UI控件链接到MediaController,并注册控制器以接收来自媒体会议。
onResume() 设置音频流,以便您的应用程序响应设备上的音量控制。
onStop() 断开MediaBrowser并在活动停止时取消注册MediaController.Callback。

public class MediaPlayerActivity extends AppCompatActivity { 
  private MediaBrowserCompat mMediaBrowser;

  @Override 
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ... 
    // Create MediaBrowserServiceCompat 
    mMediaBrowser = new MediaBrowserCompat(this,
      new ComponentName(this, MediaPlaybackService.class),
        mConnectionCallbacks, 
        null); // optional Bundle 
  } 

  @Override 
  public void onStart() { 
    super.onStart(); 
    mMediaBrowser.connect();
  } 

  @Override 
  public void onResume() { 
    super.onResume(); 
    setVolumeControlStream(AudioManager.STREAM_MUSIC);
  } 

  @Override 
  public void onStop() { 
    super.onStop(); 
    // (see "stay in sync with the MediaSession") 
    if (MediaControllerCompat.getMediaController(MediaPlayerActivity.this) != null) {
      MediaControllerCompat.getMediaController(MediaPlayerActivity.this).unregisterCallback(controllerCallback);
    } 
    mMediaBrowser.disconnect();

  } 
} 

自定义MediaBrowserCompat.ConnectionCallback


当您的活动构造MediaBrowserCompat时,您必须创建一个ConnectionCallback实例。修改其onConnected()方法以从MediaBrowserService中检索媒体会话令牌,并使用该令牌创建MediaControllerCompat。

使用便捷方法 MediaControllerCompat.setMediaController() 保存到控制器的链接。这使得可以处理媒体按钮。它还允许您MediaControllerCompat.getMediaController()在构建运输控件时调用 以检索控制器。

以下代码示例显示如何修改该onConnected()方法。

private final MediaBrowserCompat.ConnectionCallback mConnectionCallbacks =
  new MediaBrowserCompat.ConnectionCallback() {
    @Override
    public void onConnected() {

      // Get the token for the MediaSession
      MediaSessionCompat.Token token = mMediaBrowser.getSessionToken();

      // Create a MediaControllerCompat
      MediaControllerCompat mediaController =
        new MediaControllerCompat(MediaPlayerActivity.this, // Context
        token);

      // Save the controller
      MediaControllerCompat.setMediaController(MediaPlayerActivity.this, mediaController);

      // Finish building the UI
      buildTransportControls();
    }

    @Override
    public void onConnectionSuspended() {
      // The Service has crashed. Disable transport controls until it automatically reconnects
    }

    @Override
    public void onConnectionFailed() {
      // The Service has refused our connection
    }
  };

将您的用户界面连接到媒体控制器


在上面的ConnectionCallback示例代码中,包含调用buildTransportControls()以充实您的UI。您需要为控制播放器的用户界面元素设置onClickListeners。MediaControllerCompat.TransportControls为每个选择适当的 方法。

你的代码看起来像这样,每个按钮都有一个onClickListener:

void buildTransportControls()
{
  // Grab the view for the play/pause button
  mPlayPause = (ImageView) findViewById(R.id.play_pause);

  // Attach a listener to the button
  mPlayPause.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      // Since this is a play/pause button, you'll need to test the current state
      // and choose the action accordingly

      int pbState = MediaControllerCompat.getMediaController(MediaPlayerActivity.this).getPlaybackState().getState();
      if (pbState == PlaybackStateCompat.STATE_PLAYING) {
        MediaControllerCompat.getMediaController(MediaPlayerActivity.this).getTransportControls().pause();
      } else {
        MediaControllerCompat.getMediaController(MediaPlayerActivity.this).getTransportControls().play();
      }
  });

  MediaControllerCompat mediaController = MediaControllerCompat.getMediaController(MediaPlayerActivity.this);

  // Display the initial state
  MediaMetadataCompat metadata = mediaController.getMetadata();
  PlaybackStateCompat pbState = mediaController.getPlaybackState();

  // Register a Callback to stay in sync
  mediaController.registerCallback(controllerCallback);
}

TransportControls方法将回调发送到您的服务的媒体会话。确保你已经MediaSessionCompat.Callback为每个控件定义了相应的 方法。

保持与媒体会话同步


UI应显示媒体会话的当前状态,如PlaybackState和Metadata所述。创建传输控件时,可以获取会话的当前状态,将其显示在UI中,并根据状态及其可用操作启用和禁用传输控件。

要在每次状态或元数据更改时从媒体会话接收回调MediaControllerCompat.Callback,请使用以下两种方法定义一个回调 :

MediaControllerCompat.Callback controllerCallback =
  new MediaControllerCompat.Callback() {
    @Override
    public void onMetadataChanged(MediaMetadataCompat metadata) {}

    @Override
    public void onPlaybackStateChanged(PlaybackStateCompat state) {}
  };

在构建传输控件(请参阅buildTransportControls()方法)时注册回调,并在活动停止时(在活动的onStop()生命周期方法中)注销回调。

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Audio&Video】构建媒体浏览器客户端(7)

猜你喜欢

转载自blog.51cto.com/4789781/2129735