Seu app Android TV pode oferecer suporte a várias faixas de áudio/texto para diferentes idiomas e configurações de som surround da mesma forma que o receptor da Web apps. Para oferecer suporte a várias faixas e seleção de faixas, você precisa implemente o seguinte no seu app para Android TV:
Fornecer informações e status da faixa
Para clientes de nível superior
MediaInfo
,
fornecem os
MediaTracks
usando o
MediaInfoModifier
:
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() ));
Usar
MediaTracksModifier
para refletir as faixas selecionadas:
val mediaStatusModifier: MediaTracksModifier = CastReceiverContext.getInstance() .mediaManager.mediaStatusModifier.getMediaTracksModifer() MediaTracksModifier.setActiveTrackIds(longArrayOf(1))
MediaTracksModifier mediaStatusModifier = CastReceiverContext.getInstance() .getMediaManager().getMediaStatusModifier().getMediaTracksModifer(); MediaTracksModifier.setActiveTrackIds(new long[]{1});
As etapas acima podem garantir que a caixa de diálogo de seleção da faixa do remetente reflita o o estado correto.
Processar a seleção de faixas
Para oferecer suporte à seleção de faixas, primeiro é necessário declarar
MediaStatus.COMMAND_EDIT_TRACKS
como um comando de mídia compatível
MediaStatusModifier
:
CastReceiverContext .getInstance() .getMediaManager() .getMediaStatusModifier() .setMediaCommandSupported(MediaStatus.COMMAND_EDIT_TRACKS, true)
CastReceiverContext .getInstance() .getMediaManager() .getMediaStatusModifier() .setMediaCommandSupported(MediaStatus.COMMAND_EDIT_TRACKS, true);
Quando o usuário seleciona faixas na caixa de diálogo do remetente,
seu app Android TV recebe um callback para mudar as faixas selecionadas.
Processar o comando substituindo
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) { ... } }