قد يتيح تطبيق Android TV مقاطع صوتية أو نصية متعددة لمختلف الأنواع إعدادات اللغات والصوت المحيطي بالطريقة نفسها المستخدَمة على جهاز استقبال الويب التطبيقات. لإتاحة مسارات متعددة واختيار مسارات متعددة، يجب: نفِّذ ما يلي في تطبيق Android TV:
تقديم معلومات المسار وحالته
بالنسبة إلى الأعضاء في المستوى الأعلى
MediaInfo
،
توفير الموارد
MediaTracks
باستخدام
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() ));
استخدام
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});
من خلال الخطوات أعلاه، يمكنك التأكّد من أنّ مربّع حوار اختيار تتبُّع المُرسِل يعكس الحالة الصحيحة.
اختيار المسار المعرِّف
للسماح باختيار مقطع صوتي، يجب الإفصاح أولاً.
MediaStatus.COMMAND_EDIT_TRACKS
كأمر وسائط متوافق في
MediaStatusModifier
:
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) { ... } }