Android Studio V3.12環(huán)境下TV開發(fā)教程
(轉(zhuǎn)自Android官網(wǎng)https://developer.android.com/training/tv/start)
文章源自:光谷佳武 https://blog.csdn.net/jiawuhan/article/details/80620508
在播放器后面或背景中播放媒體時(shí),電視應(yīng)用程序必須顯示正在播放的卡片缸血。?此卡允許用戶返回到當(dāng)前播放媒體的應(yīng)用程序。
當(dāng)存在活動(dòng)的MediaSession時(shí),Android框架會(huì)在主屏幕上顯示正在播放的卡片。?該卡包括媒體元數(shù)據(jù)秧倾,如專輯封面屎暇,標(biāo)題和應(yīng)用程序圖標(biāo)。?當(dāng)用戶選擇該卡時(shí)原在,系統(tǒng)打開該應(yīng)用程序。
本節(jié)介紹如何使用MediaSession類來實(shí)現(xiàn)即時(shí)播放卡文兢。
圖1.在后臺(tái)播放媒體時(shí)顯示正在播放的卡片晤斩。
當(dāng)您的應(yīng)用準(zhǔn)備播放媒體時(shí)創(chuàng)建一個(gè)MediaSession?。?以下代碼片段是如何設(shè)置適當(dāng)?shù)幕卣{(diào)和標(biāo)志的示例:
mSession = new MediaSession(this姆坚,“MusicService”); mSession.setCallback(new MediaSessionCallback()); mSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
注意:?正在使用的卡僅顯示設(shè)置了FLAG_HANDLES_TRANSPORT_CONTROLS標(biāo)志的媒體會(huì)話澳泵。
正在使用的卡僅出現(xiàn)在活動(dòng)會(huì)話中。?播放開始時(shí)兼呵,您必須調(diào)用setActive(true)?兔辅。?您的應(yīng)用程序還必須請(qǐng)求音頻焦點(diǎn)腊敲,如管理音頻焦點(diǎn)中所述?。
private void handlePlayRequest(){ tryToGetAudioFocus(); if(维苔!mSession.isActive()){ mSession.setActive(true); } ...
當(dāng)setActive(false)呼叫停用媒體會(huì)話或另一個(gè)應(yīng)用啟動(dòng)媒體播放時(shí)碰辅,會(huì)從啟動(dòng)器屏幕中刪除該卡。?如果播放完全停止并且沒有活動(dòng)媒體介时,則應(yīng)用程序應(yīng)立即停用媒體會(huì)話没宾。?如果播放暫停,則應(yīng)用程序應(yīng)在延遲后停用媒體會(huì)話沸柔,通常為5到30分鐘循衰。
更新MediaSession的播放狀態(tài),以便卡片可以顯示當(dāng)前媒體的狀態(tài)褐澎。
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()方法設(shè)置MediaMetadata?迁酸。?媒體會(huì)話對(duì)象的這種方法可以讓您為正在播放的卡片提供關(guān)于曲目的信息,例如標(biāo)題俭正,副標(biāo)題和各種圖標(biāo)奸鬓。?以下示例假設(shè)您的軌道數(shù)據(jù)存儲(chǔ)在自定義數(shù)據(jù)類MediaData?。
private void updateMetadata(MediaData myData){ MediaMetadata.Builder metadataBuilder = new MediaMetadata.Builder(); //提供對(duì)項(xiàng)目顯示方式的最大控制 //顯示元數(shù)據(jù)中的字段 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); //至少是傳統(tǒng)支持的標(biāo)題和藝術(shù)家 metadataBuilder.putString(MediaMetadata.METADATA_KEY_TITLE寺枉, myData.title); metadataBuilder.putString(MediaMetadata.METADATA_KEY_ARTIST, myData.artist); //還推薦了一個(gè)用于藝術(shù)品的小位圖 metadataBuilder.putBitmap(MediaMetadata.METADATA_KEY_ART绷落, myData.artBitmap); //添加您的數(shù)據(jù)的其他任何字段 mSession.setMetadata(metadataBuilder.build()); }
當(dāng)用戶選擇正在使用卡時(shí)姥闪,系統(tǒng)打開擁有該會(huì)話的應(yīng)用程序。?如果您的應(yīng)用程序向setSessionActivity()提供了PendingIntent?砌烁,系統(tǒng)將啟動(dòng)您指定的活動(dòng)筐喳,如下所示。?如果不是函喉,則默認(rèn)系統(tǒng)意圖打開避归。?您指定的活動(dòng)必須提供允許用戶暫停或停止播放的播放控件管呵。
Intent intent = new Intent(mContext, MyActivity.class);? ? PendingIntent pi = PendingIntent.getActivity(context, 99 /*request code*/,? ? ? ? ? ? intent, PendingIntent.FLAG_UPDATE_CURRENT);? ? mSession.setSessionActivity(pi);