原
要完成客户端/服务器设计,您必须构建一个包含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
公众号推荐: