您的位置:首页 > 移动开发

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

2017-02-06 08:55 555 查看

构建媒体浏览客户端(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())注销它。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐