Android Studio V3.12环境下TV开发教程
在播放器后面或背景中播放媒体时,电视应用程序必须显示正在播放的卡片。 此卡允许用户返回到当前播放媒体的应用程序。
当存在活动的MediaSession时,Android框架会在主屏幕上显示正在播放的卡片。 该卡包括媒体元数据,如专辑封面,标题和应用程序图标。 当用户选择该卡时,系统打开该应用程序。
本节介绍如何使用MediaSession类来实现即时播放卡。
图1.在后台播放媒体时显示正在播放的卡片。
当您的应用准备播放媒体时创建一个MediaSession 。 以下代码片段是如何设置适当的回调和标志的示例:
mSession = new MediaSession(this,“MusicService”); mSession.setCallback(new MediaSessionCallback()); mSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
正在使用的卡仅出现在活动会话中。 播放开始时,您必须调用setActive(true) 。 您的应用程序还必须请求音频焦点,如管理音频焦点中所述 。
private void handlePlayRequest(){ tryToGetAudioFocus(); if(!mSession.isActive()){ mSession.setActive(true); } ...
当setActive(false)呼叫停用媒体会话或另一个应用启动媒体播放时,会从启动器屏幕中删除该卡。 如果播放完全停止并且没有活动媒体,则应用程序应立即停用媒体会话。 如果播放暂停,则应用程序应在延迟后停用媒体会话,通常为5到30分钟。
更新MediaSession的播放状态,以便卡片可以显示当前媒体的状态。
private void updatePlaybackState(){ long position = PlaybackState.PLAYBACK_POSITION_UNKNOWN;if(mMediaPlayer!= null && mMediaPlayer.isPlaying()){ position = mMediaPlayer.getCurrentPosition(); } PlaybackState.Builder stateBuilder = new PlaybackState.Builder() .setActions(getAvailableActions()); stateBuilder.setState(mState,position,1.0f); mSession.setPlaybackState(stateBuilder.build()); } private long getAvailableActions(){ long actions = PlaybackState.ACTION_PLAY_PAUSE | PlaybackState.ACTION_PLAY_FROM_MEDIA_ID | PlaybackState.ACTION_PLAY_FROM_SEARCH; if(mPlayingQueue == null || mPlayingQueue.isEmpty()){return; } if(mState == PlaybackState.STATE_PLAYING){ actions | = PlaybackState.ACTION_PAUSE; } else { actions | = PlaybackState.ACTION_PLAY; } if(mCurrentIndexOnQueue> 0){ actions | = PlaybackState.ACTION_SKIP_TO_PREVIOUS; } if(mCurrentIndexOnQueue
使用setMetadata()方法设置MediaMetadata 。 媒体会话对象的这种方法可以让您为正在播放的卡片提供关于曲目的信息,例如标题,副标题和各种图标。 以下示例假设您的轨道数据存储在自定义数据类MediaData 。
private void updateMetadata(MediaData myData){ MediaMetadata.Builder metadataBuilder = new MediaMetadata.Builder(); //提供对项目显示方式的最大控制 //显示元数据中的字段 metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_TITLE, myData.displayTitle); metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_SUBTITLE, myData.displaySubtitle); metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_ICON_URI, myData.artUri); //至少是传统支持的标题和艺术家 metadataBuilder.putString(MediaMetadata.METADATA_KEY_TITLE, myData.title); metadataBuilder.putString(MediaMetadata.METADATA_KEY_ARTIST, myData.artist); //还推荐了一个用于艺术品的小位图 metadataBuilder.putBitmap(MediaMetadata.METADATA_KEY_ART, myData.artBitmap); //添加您的数据的其他任何字段 mSession.setMetadata(metadataBuilder.build()); }
当用户选择正在使用卡时,系统打开拥有该会话的应用程序。 如果您的应用程序向setSessionActivity()提供了PendingIntent ,系统将启动您指定的活动,如下所示。 如果不是,则默认系统意图打开。 您指定的活动必须提供允许用户暂停或停止播放的播放控件。
Intent intent = new Intent(mContext, MyActivity.class); PendingIntent pi = PendingIntent.getActivity(context, 99 /*request code*/, intent, PendingIntent.FLAG_UPDATE_CURRENT); mSession.setSessionActivity(pi);