Android TV 앱은 웹 수신기 앱과 동일한 방식으로 다양한 언어의 여러 오디오/텍스트 트랙과 서라운드 사운드 설정을 지원할 수 있습니다. 여러 트랙과 트랙 선택을 지원하려면 Android TV 앱에서 다음을 구현해야 합니다.
트랙 정보 및 상태 제공
최상위 수준 MediaInfo
의 경우 MediaInfoModifier
를 사용하여 사용 가능한 MediaTracks
를 제공합니다.
val mediaInfoModifier = CastReceiverContext.getInstance() .mediaManager.mediaStatusModifier.mediaInfoModifier mediaInfoModifier.setMediaTracks(Arrays.asList( new MediaTrack.Builder(1, MediaTrack.TYPE_AUDIO) .setName("English") ... build(), new MediaTrack.Builder(2, MediaTrack.TYPE_AUDIO) .setName("Spanish") ... .build() ))
MediaInfoModifier mediaInfoModifier = CastReceiverContext.getInstance() .getMediaManager().getMediaStatusModifier().getMediaInfoModifier(); mediaInfoModifier.setMediaTracks(Arrays.asList( new MediaTrack.Builder(1, MediaTrack.TYPE_AUDIO) .setName("English") ... build(), new MediaTrack.Builder(2, MediaTrack.TYPE_AUDIO) .setName("Spanish") ... .build() ));
MediaTracksModifier
를 사용하여 현재 선택된 트랙을 반영합니다.
val mediaStatusModifier: MediaTracksModifier = CastReceiverContext.getInstance() .mediaManager.mediaStatusModifier.getMediaTracksModifer() MediaTracksModifier.setActiveTrackIds(longArrayOf(1))
MediaTracksModifier mediaStatusModifier = CastReceiverContext.getInstance() .getMediaManager().getMediaStatusModifier().getMediaTracksModifer(); MediaTracksModifier.setActiveTrackIds(new long[]{1});
위 단계를 통해 발신자 추적 선택 대화상자에 올바른 상태가 반영되었는지 확인할 수 있습니다.
트랙 선택 처리
트랙 선택을 지원하려면 먼저 MediaStatusModifier
에서 MediaStatus.COMMAND_EDIT_TRACKS
를 지원되는 미디어 명령어로 선언해야 합니다.
CastReceiverContext .getInstance() .getMediaManager() .getMediaStatusModifier() .setMediaCommandSupported(MediaStatus.COMMAND_EDIT_TRACKS, true)
CastReceiverContext .getInstance() .getMediaManager() .getMediaStatusModifier() .setMediaCommandSupported(MediaStatus.COMMAND_EDIT_TRACKS, true);
사용자가 발신자 측의 트랙 선택 대화상자에서 트랙을 선택하면 Android TV 앱이 선택된 트랙을 변경하는 콜백을 수신합니다.
MediaCommandCallback
를 재정의하여 명령어를 처리합니다.
class MyMediaCommandCallback : MediaCommandCallback() { /** Text selection callback scoped to individual track types. */ override fun onSelectTracksByType( senderId: String?, type: Int, tracks: List): Task { return Tasks.call { // Update the track selection in your app. if (type == MediaTrack.TYPE_TEXT) { mySelectTextTracks(tracks) } else if (type == MediaTrack.TYPE_AUDIO) { mySelectAudioTracks(tracks) } // Update the track selection in the modifier to be used in MediaStatus. // This is also scoped to the given track type. mediaStatusModifier.getMediaTracksModifier().setActiveTracksByType( type, tracks ) null } } /** Callback for setting the text track style. */ override fun onSetTextTrackStyle( senderId: String?, textTrackStyle: TextTrackStyle ): Task { return Tasks.call { // Update the track style in your app. mySetTextTrackStyle(textTrackStyle) // Update the track style in the modifier. mediaStatusModifier.setTextTrackStyle(textTrackStyle) null } } // Override the following callback in case you want to handle the original // request. This is strongly not recommended. // // The default implementation automatically translates into // onSelectTracksByType() and onSetTextTrackStyle(). override fun onEditTracksInfo( senderId: String?, editTracksInfoData: EditTracksInfoData ): Task { ... } // Override the following callback in case you want to handle the original // request. This is strongly not recommended. override fun onEditAudioTracks( senderId: String?, editAudioTracksData: EditAudioTracksData ): Task { ... } }
public class MyMediaCommandCallback extends MediaCommandCallback { /** Text selection callback scoped to individual track types. */ @Override public TaskonSelectTracksByType( String senderId, int type, List tracks) { return Tasks.call(() -> { // Update the track selection in your app. if (type == MediaTrack.TYPE_TEXT) { mySelectTextTracks(tracks); } else if (type == MediaTrack.TYPE_AUDIO) { mySelectAudioTracks(tracks); } // Update the track selection in the modifier to be used in MediaStatus. // This is also scoped to the given track type. mediaStatusModifier.getMediaTracksModifier().setActiveTracksByType( type, tracks); return null; }); } /** Callback for setting the text track style. */ @Override public Task onSetTextTrackStyle( String senderId, TextTrackStyle textTrackStyle) { return Tasks.call(() -> { // Update the track style in your app. mySetTextTrackStyle(textTrackStyle); // Update the track style in the modifier. mediaStatusModifier.setTextTrackStyle(textTrackStyle); return null; }); } // Override the following callback in case you want to handle the original // request. This is strongly not recommended. // // The default implementation automatically translates into // onSelectTracksByType() and onSetTextTrackStyle(). @Override public Task onEditTracksInfo( String senderId, EditTracksInfoData editTracksInfoData) { ... } // Override the following callback in case you want to handle the original // request. This is strongly not recommended. @Override public Task onEditAudioTracks( String senderId, EditAudioTracksData editAudioTracksData) { ... } }