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