Tracks

Your Android TV app may support multiple audio/text tracks for different languages and surround sound settings in the same way as web receiver apps. In order to support multiple tracks and track selection, you need to implement the following in your Android TV app:

Provide track info and status

For the top-level MediaInfo , provide the available MediaTracks using the MediaInfoModifier :

Kotlin
 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 
 () 
  
 )) 
Java
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()
  ));

Use MediaTracksModifier to reflect the currently selected tracks:

Kotlin
 val 
  
 mediaStatusModifier 
 : 
  
 MediaTracksModifier 
  
 = 
  
 CastReceiverContext 
 . 
 getInstance 
 () 
  
 . 
 mediaManager 
 . 
 mediaStatusModifier 
 . 
 getMediaTracksModifer 
 () 
 MediaTracksModifier 
 . 
 setActiveTrackIds 
 ( 
 longArrayOf 
 ( 
 1 
 )) 
Java
MediaTracksModifier mediaStatusModifier =
  CastReceiverContext.getInstance()
    .getMediaManager().getMediaStatusModifier().getMediaTracksModifer();

MediaTracksModifier.setActiveTrackIds(new long[]{1});

The above steps can make sure the sender track selection dialog reflects the correct state.

Handle track selection

To support selecting a track, you must first declare MediaStatus.COMMAND_EDIT_TRACKS as a supported media command in MediaStatusModifier :

Kotlin
 CastReceiverContext 
  
 . 
 getInstance 
 () 
  
 . 
 getMediaManager 
 () 
  
 . 
 getMediaStatusModifier 
 () 
  
 . 
 setMediaCommandSupported 
 ( 
 MediaStatus 
 . 
 COMMAND_EDIT_TRACKS 
 , 
  
 true 
 ) 
Java
CastReceiverContext
    .getInstance()
    .getMediaManager()
    .getMediaStatusModifier()
    .setMediaCommandSupported(MediaStatus.COMMAND_EDIT_TRACKS, true);

When the user selects tracks in the track selection dialog on the sender side, your Android TV app receives a callback to change the selected tracks. Handle the command by overriding MediaCommandCallback :

Kotlin
 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 
   
 { 
  
 ... 
  
 } 
 } 
 
 
 
 
 
 
 
Java
 public 
  
 class 
  
 MyMediaCommandCallback 
  
 extends 
  
 MediaCommandCallback 
  
 { 
  
 /** 
  
 Text 
  
 selection 
  
 callback 
  
 scoped 
  
 to 
  
 individual 
  
 track 
  
 types 
 . 
  
 */ 
  
 @ 
 Override 
  
 public 
  
 Task 
   
 onSelectTracksByType 
 ( 
  
 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 
 ) 
  
 { 
  
 ... 
  
 } 
 } 
 
 
 
 
 
Design a Mobile Site
View Site in Mobile | Classic
Share by: