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

    xiaoxiao2021-03-26  28

    构建媒体浏览客户端(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())注销它。

    转载请注明原文地址: https://ju.6miu.com/read-662996.html

    最新回复(0)