Android API Guide for Media Apps(五)——构建媒体浏览客户端(Building a Media Browser Client)

构建媒体浏览客户端(Building a Media Browser Client)

为了完成client/server的设计,你必须构建一个包含UI代码,关联MediaController和MediaBrowser的activity组件。

MediaBrowser实现两个重要的功能:连接MediaBrowserService,并连接上后创建UI的MediaController。

连接MediaBrowserService(Connect to the MediaBrowserService)

当你的客户端activity被创建,它连接一个MediaBrowserService。这里有很少的交互涉及。如下修改activity的生命周期回调:

  • onCreate() 构造一个MediaBrowserCompat。传入你MediaBrowserService和已定义的MediaBrowserCompat.ConnectionCallback 的名字。

  • onStart() 连接MediaBrowserService。这就是MediaBrowserCompat.ConnectionCallback的神奇之处。如果连接成功,onConnect()的回调会创建媒体控制器,并连接它的媒体会话,连接你的UI控件到MediaController上并从媒体会话中注册这个控制器到接收的回调上。

  • onStop() 在activity停止时断开MediaBrowser的连接并注销 MediaController.Callback。

public class MediaPlayerActivity extends AppCompatActivity {
  private MediaBrowserCompat mMediaBrowser;

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

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

    @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(Customize MediaBrowserCompat.ConnectionCallback)

当你的activity构造MediaBrowserCompat,你必须创建一个ConnectionCallback实例。修改它的onConnected()方法来获取MediaBrowserService 中的媒体会话token以便创建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 = mediaBrowser.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
    }
  };

连接UI到媒体控制器上(Connect your UI to the media controller)

在上面的ConnectionCallback 示例中,包含了调用buildTransportControls()填充你的UI。你还需要为控制播放器的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).getPlabackState().getState();
                    If (pbState == PlaybackState.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
  MetadataCompat metadata = mediaController.getMetadata();
  PlaybackStateCompat pbState = mediaController.getPlabackState();

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

TransportControls 方法发送回调方法到你服务的媒体会话中。确保你已为每个控件定义一个对应的MediaSessionCompat.Callback方法。

使用媒体会话保持同步(Stay in sync with the media session)

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()方法)和杂activity停止(在activity生命周期中的onStop())注销它。

猜你喜欢

转载自blog.csdn.net/u014011112/article/details/54889531