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())注销它。
相关文章推荐
- Android API Guide for Media Apps(四)—— 构建媒体浏览器服务(Building a Media Browser Service)
- Android API Guide for Media Apps(七)——构建一个视频应用(Building a Video App)
- Android API Guide for Media Apps(八)——构建一个视频播放器Activity(Building a Video Player Activity)
- Android API Guide for Media Apps(三)—— 构建音频应用(Building an Audio App)
- Android API Guide for Media Apps(二)——媒体会话的使用(Working with a Mession)
- Android API Guide for Media Apps(九)——媒体会话的回调(Media Session Callbacks)
- Android API Guide for Media Apps(六)——媒体会话的回调(Media Session Callbacks)
- Android API Guide for Media Apps —— 媒体应用
- Android API Guide for Media Apps(一)——概览(Overview)
- Android API Guide for Media and Camera(三)—— 媒体与相机(ExoPlayer)
- Android API Guide for Media and Camera(一)—— 媒体与相机(媒体播放器)
- Android API Guide for Media and Camera(二)—— 媒体与相机(媒体记录器)
- Android API Guide for Media and Camera(四)—— 媒体与相机(媒体路由)
- Android API Guide for Media and Camera(五)—— 媒体与相机(Camera API)
- gradle 构建 Smack 报错:Can't find android.jar for 8 API. + steps for building android platform
- Practical Multithreading for Client Apps (.net客户端程序使用多线程的实践)
- Android Wear 进阶0.1 进阶表: Developing for Android Wear - Building Apps for Wearables
- Building a WebRTC Client for Android
- Android API Guide for Animation and Graphics(四)—— 动画与图形(帧动画)
- 使用ArcGIS API for Flex构建Android和iOS移动地图应用程序