Włączanie przesyłania w aplikacji na Androida TV

1. Przegląd

Logo Google Cast

Z tego laboratorium dowiesz się, jak zmodyfikować istniejącą aplikację na Androida TV, aby obsługiwała przesyłanie i komunikację z dotychczasowymi aplikacjami nadawczymi Cast.

Co to jest Google Cast i Cast Connect?

Google Cast umożliwia przesyłanie treści z urządzenia mobilnego na telewizor. Typowa sesja Google Cast składa się z 2 komponentów – aplikacji nadawcy i aplikacji odbiorcy. Aplikacje wysyłające, takie jak aplikacja mobilna lub witryna, np. Youtube.com, inicjują i kontrolują odtwarzanie aplikacji odbiornika Cast. Aplikacje odbiornika przesyłania to aplikacje HTML5, które działają na urządzeniach Chromecast i Android TV.

Prawie wszystkie dane sesji Cast są przechowywane w aplikacji odbiornika. Gdy stan się zmieni, np. zostanie załadowany nowy element multimedialny, do wszystkich nadawców zostanie wysłany stan multimediów. Te transmisje zawierają aktualny stan sesji przesyłania. Aplikacje wysyłające używają tego stanu multimediów do wyświetlania informacji o odtwarzaniu w interfejsie.

Cast Connect korzysta z tej infrastruktury, a aplikacja na Androida TV działa jako odbiornik. Biblioteka Cast Connect umożliwia aplikacji na Androida TV odbieranie wiadomości i przesyłanie stanu multimediów tak, jakby była aplikacją odbiornika Cast.

Co będziemy tworzyć?

Po ukończeniu tego ćwiczenia z programowania będziesz w stanie używać aplikacji przesyłających treści do przesyłania filmów do aplikacji na Androida TV. Aplikacja na Androida TV może też komunikować się z aplikacjami przesyłającymi treści za pomocą protokołu Cast.

Czego się nauczysz

  • Jak dodać bibliotekę Cast Connect do przykładowej aplikacji ATV.
  • Jak połączyć nadajnik Cast i uruchomić aplikację ATV.
  • Jak rozpocząć odtwarzanie multimediów w aplikacji ATV z aplikacji wysyłającej Cast.
  • Jak wysyłać stan multimediów z aplikacji ATV do aplikacji wysyłających Cast.

Czego potrzebujesz

2. Pobieranie przykładowego kodu

Możesz pobrać cały przykładowy kod na komputer…

i rozpakuj pobrany plik ZIP.

3. Uruchamianie przykładowej aplikacji

Najpierw zobaczmy, jak wygląda gotowa przykładowa aplikacja. Aplikacja na Androida TV korzysta z interfejsu Leanback i podstawowego odtwarzacza wideo. Użytkownik może wybrać film z listy, który po wybraniu zostanie odtworzony na telewizorze. Za pomocą towarzyszącej aplikacji mobilnej nadawcy użytkownik może też przesyłać filmy do aplikacji na Androida TV.

Obraz przedstawiający serię miniatur filmów (jedna z nich jest wyróżniona) nałożonych na podgląd filmu na pełnym ekranie; w prawym górnym rogu widnieje napis „Cast Connect”.

Rejestrowanie urządzeń deweloperskich

Aby włączyć funkcje Cast Connect na potrzeby tworzenia aplikacji, musisz zarejestrować numer seryjny urządzenia z Androidem TV, którego będziesz używać w Konsoli programisty Cast. Numer seryjny znajdziesz w sekcji Ustawienia > Ustawienia urządzenia > Google Cast > Numer seryjny na Androidzie TV. Pamiętaj, że różni się on od numeru seryjnego urządzenia fizycznego i musisz go uzyskać za pomocą opisanej powyżej metody.

Obraz ekranu Androida TV z wyświetlonym ekranem „Google Cast”, numerem wersji i numerem seryjnym

Bez rejestracji Cast Connect będzie działać tylko w przypadku aplikacji zainstalowanych ze Sklepu Google Play ze względów bezpieczeństwa. Po 15 minutach od rozpoczęcia procesu rejestracji zrestartuj urządzenie.

Instalowanie aplikacji nadawcy na Androida

Aby przetestować wysyłanie żądań z urządzenia mobilnego, udostępniliśmy prostą aplikację do wysyłania o nazwie Cast Videos as mobile-sender-0629.apk w pobranym pliku ZIP z kodem źródłowym. Do zainstalowania pliku APK użyjemy ADB. Jeśli masz już zainstalowaną inną wersję Cast Videos, przed kontynuowaniem odinstaluj ją ze wszystkich profili na urządzeniu.

  1. Włącz opcje programisty i debugowanie USB na telefonie z Androidem.
  2. Podłącz kabel USB do transmisji danych, aby połączyć telefon z Androidem z komputerem deweloperskim.
  3. Zainstaluj mobile-sender-0629.apk na telefonie z Androidem.

Obraz okna terminala z uruchomionym poleceniem adb install, które służy do instalowania pliku mobile-sender.apk

  1. Aplikację wysyłającą Przesyłaj filmy znajdziesz na telefonie z Androidem. Ikona aplikacji nadawcy Przesyłanie filmów

Obraz aplikacji nadawcy Przesyłaj filmy uruchomionej na ekranie telefonu z Androidem

Instalowanie aplikacji na Androida TV

Poniżej znajdziesz instrukcje otwierania i uruchamiania gotowej przykładowej aplikacji w Android Studio:

  1. Na ekranie powitalnym wybierz Importuj projekt lub kliknij Plik > Nowy > Importuj projekt….
  2. Wybierz katalog ikona folderuapp-done z folderu z przykładowym kodem i kliknij OK.
  3. Kliknij PlikPrzycisk Synchronizuj projekt z Gradle w Android App Studio Synchronizuj projekt z plikami Gradle.
  4. Włącz opcje programisty i debugowanie USB na urządzeniu z Androidem TV.
  5. Połącz się z urządzeniem z Androidem TV za pomocą ADB. Urządzenie powinno być widoczne w Android Studio. Obraz przedstawiający urządzenie z Androidem TV na pasku narzędzi Androida Studio
  6. Kliknij przycisk Przycisk Uruchom w Android Studio, zielony trójkąt skierowany w prawoUruchom. Po kilku sekundach powinna pojawić się aplikacja ATV o nazwie Cast Connect Codelab.

Zagrajmy w Cast Connect w aplikacji ATV

  1. Otwórz ekran główny Androida TV.
  2. Otwórz aplikację nadawczą Przesyłaj filmy na telefonie z Androidem. Kliknij przycisk Cast Ikona przycisku Cast i wybierz urządzenie ATV.
  3. Na urządzeniu ATV zostanie uruchomiona aplikacja Cast Connect Codelab ATV, a przycisk Cast w aplikacji wysyłającej będzie wskazywać, że jest połączony Ikona przycisku Cast z odwróconymi kolorami.
  4. Wybierz film w aplikacji ATV, a rozpocznie się jego odtwarzanie na urządzeniu ATV.
  5. Na telefonie komórkowym u dołu aplikacji wysyłającej jest teraz widoczny minikontroler. Możesz użyć przycisku odtwarzania/wstrzymywania, aby sterować odtwarzaniem.
  6. Wybierz film na telefonie komórkowym i odtwórz go. Film zacznie się odtwarzać na ATV, a na urządzeniu mobilnym pojawi się rozszerzony kontroler.
  7. Zablokuj telefon, a gdy go odblokujesz, na ekranie blokady powinno pojawić się powiadomienie umożliwiające sterowanie odtwarzaniem multimediów lub zatrzymanie przesyłania.

Obraz przedstawiający fragment ekranu telefonu z Androidem z miniplayerem odtwarzającym film.

4. Przygotowywanie projektu początkowego

Po zweryfikowaniu ukończonej integracji Cast Connect w aplikacji musimy dodać obsługę Cast Connect do pobranej aplikacji startowej. Możesz teraz rozbudowywać projekt początkowy za pomocą Androida Studio:

  1. Na ekranie powitalnym wybierz Importuj projekt lub kliknij Plik > Nowy > Importuj projekt….
  2. Wybierz katalog ikona folderuapp-start z folderu z przykładowym kodem i kliknij OK.
  3. Kliknij PlikPrzycisk Synchronizuj projekt z Gradle w Android Studio Synchronizuj projekt z plikami Gradle.
  4. Wybierz urządzenie ATV i kliknij przycisk Przycisk Uruchom w Android Studio, zielony trójkąt skierowany w prawoUruchom, aby uruchomić aplikację i przetestować interfejs. Pasek narzędzi Androida Studio z wybranym urządzeniem z Androidem TV

Obraz przedstawiający serię miniatur filmów (jedna z nich jest wyróżniona) nałożonych na podgląd filmu na pełnym ekranie; w prawym górnym rogu widnieje napis „Cast Connect”.

Projektowanie aplikacji

Aplikacja wyświetla listę filmów, które użytkownik może przeglądać. Użytkownicy mogą wybrać film do odtworzenia na Androidzie TV. Aplikacja składa się z 2 głównych działań: MainActivityPlaybackActivity.

MainActivity

Ta aktywność zawiera fragment (MainFragment). Lista filmów i powiązanych z nimi metadanych jest skonfigurowana w klasie MovieList, a metoda setupMovies() jest wywoływana w celu utworzenia listy obiektów Movie.

Obiekt Movie reprezentuje element wideo z tytułem, opisem, miniaturami obrazów i adresem URL filmu. Każdy obiekt Movie jest powiązany z obiektem CardPresenter, aby wyświetlać miniaturę filmu z tytułem i studiem, i jest przekazywany do obiektu ArrayObjectAdapter.

Gdy element zostanie wybrany, odpowiedni obiekt Movie zostanie przekazany do PlaybackActivity.

PlaybackActivity

Ta aktywność zawiera fragment (PlaybackVideoFragment), który zawiera VideoViewExoPlayer, niektóre opcje sterowania multimediami i obszar tekstowy do wyświetlania opisu wybranego filmu. Umożliwia też użytkownikowi odtwarzanie filmu na Androidzie TV. Użytkownik może używać pilota do odtwarzania i wstrzymywania filmów oraz przewijania ich.

Wymagania wstępne Cast Connect

Cast Connect korzysta z nowych wersji Usług Google Play, które wymagają, aby aplikacja na ATV została zaktualizowana w celu używania przestrzeni nazw AndroidX.

Aby obsługiwać Cast Connect w aplikacji na Androida TV, musisz tworzyć i obsługiwać zdarzenia z sesji multimedialnej. Biblioteka Cast Connect generuje stan multimediów na podstawie stanu sesji multimediów. Sesja multimedialna jest też używana przez bibliotekę Cast Connect do sygnalizowania, kiedy otrzymała od nadawcy określone wiadomości, np. wstrzymanie.

5. Konfigurowanie obsługi Cast

Zależności

Zaktualizuj plik build.gradle aplikacji, aby uwzględnić niezbędne zależności bibliotek:

dependencies {
    ....

    // Cast Connect libraries
    implementation 'com.google.android.gms:play-services-cast-tv:20.0.0'
    implementation 'com.google.android.gms:play-services-cast:21.1.0'
}

Zsynchronizuj projekt, aby sprawdzić, czy kompilacja przebiega bez błędów.

Zdarzenie inicjujące

CastReceiverContext to pojedynczy obiekt koordynujący wszystkie interakcje Cast. Musisz zaimplementować interfejs ReceiverOptionsProvider, aby udostępnić CastReceiverOptions podczas inicjowania CastReceiverContext.

Utwórz plik CastReceiverOptionsProvider.kt i dodaj do projektu tę klasę:

package com.google.sample.cast.castconnect

import android.content.Context
import com.google.android.gms.cast.tv.ReceiverOptionsProvider
import com.google.android.gms.cast.tv.CastReceiverOptions

class CastReceiverOptionsProvider : ReceiverOptionsProvider {
    override fun getOptions(context: Context): CastReceiverOptions {
        return CastReceiverOptions.Builder(context)
                .setStatusText("Cast Connect Codelab")
                .build()
    }
}

Następnie w tagu <application> pliku AndroidManifest.xml aplikacji określ dostawcę opcji odbiornika:

<application>
  ...
  <meta-data
    android:name="com.google.android.gms.cast.tv.RECEIVER_OPTIONS_PROVIDER_CLASS_NAME"
    android:value="com.google.sample.cast.castconnect.CastReceiverOptionsProvider" />
</application>

Aby połączyć się z aplikacją ATV z urządzenia wysyłającego Cast, wybierz aktywność, którą chcesz uruchomić. W tym laboratorium kodowania uruchomimy MainActivity aplikacji po rozpoczęciu sesji Cast. W pliku AndroidManifest.xml dodaj filtr intencji uruchamiania w MainActivity.

<activity android:name=".MainActivity">
  ...
  <intent-filter>
    <action android:name="com.google.android.gms.cast.tv.action.LAUNCH" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

Cykl życia kontekstu odbiornika przesyłania

CastReceiverContext należy uruchamiać po uruchomieniu aplikacji, a zatrzymywać, gdy aplikacja przechodzi w tryb działania w tle.CastReceiverContext Zalecamy używanie LifecycleObserverbiblioteki androidx.lifecycle do zarządzania wywołaniami CastReceiverContext.start()CastReceiverContext.stop().

Otwórz plik MyApplication.kt i zainicjuj kontekst przesyłania, wywołując funkcję initInstance() w metodzie onCreate aplikacji. W klasie AppLifeCycleObserver start() CastReceiverContext, gdy aplikacja jest wznawiana, i stop(), gdy jest wstrzymywana:

package com.google.sample.cast.castconnect

import com.google.android.gms.cast.tv.CastReceiverContext
...

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        CastReceiverContext.initInstance(this)
        ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver())
    }

    class AppLifecycleObserver : DefaultLifecycleObserver {
        override fun onResume(owner: LifecycleOwner) {
            Log.d(LOG_TAG, "onResume")
            CastReceiverContext.getInstance().start()
        }

        override fun onPause(owner: LifecycleOwner) {
            Log.d(LOG_TAG, "onPause")
            CastReceiverContext.getInstance().stop()
        }
    }
}

Łączenie MediaSession z MediaManager

MediaManager jest właściwością pojedynczego obiektu CastReceiverContext. Zarządza stanem multimediów, obsługuje intencję wczytywania, tłumaczy wiadomości z przestrzeni nazw multimediów od nadawców na polecenia multimedialne i wysyła stan multimediów z powrotem do nadawców.

Podczas tworzenia MediaSession musisz też podać bieżący MediaSession token do MediaManager, aby wiedział, gdzie wysyłać polecenia i pobierać stan odtwarzania multimediów. W pliku PlaybackVideoFragment.kt sprawdź, czy zmienna MediaSession została zainicjowana przed ustawieniem tokena na MediaManager.

import com.google.android.gms.cast.tv.CastReceiverContext
import com.google.android.gms.cast.tv.media.MediaManager
...

class PlaybackVideoFragment : VideoSupportFragment() {
    private var castReceiverContext: CastReceiverContext? = null
    ...

    private fun initializePlayer() {
        if (mPlayer == null) {
            ...
            mMediaSession = MediaSessionCompat(getContext(), LOG_TAG)
            ...
            castReceiverContext = CastReceiverContext.getInstance()
            if (castReceiverContext != null) {
                val mediaManager: MediaManager = castReceiverContext!!.getMediaManager()
                mediaManager.setSessionCompatToken(mMediaSession!!.getSessionToken())
            }

        }
    }
}

Gdy zwalniasz MediaSession z powodu braku aktywności podczas odtwarzania, ustaw token zerowy w MediaManager:

private fun releasePlayer() {
    mMediaSession?.release()
    castReceiverContext?.mediaManager?.setSessionCompatToken(null)
    ...
}

Uruchamianie przykładowej aplikacji

Kliknij przycisk Przycisk Uruchom w Android Studio, zielony trójkąt skierowany w prawoUruchom, aby wdrożyć aplikację na urządzeniu ATV, zamknąć aplikację i wrócić do ekranu głównego ATV. Na urządzeniu nadawcy kliknij przycisk Cast Ikona przycisku Cast i wybierz urządzenie ATV. Aplikacja ATV zostanie uruchomiona na urządzeniu ATV, a stan przycisku Cast zmieni się na połączony.

6. Wczytuję multimedia

Polecenie wczytywania jest wysyłane za pomocą intencji z nazwą pakietu zdefiniowaną w konsoli dewelopera. Aby określić aktywność docelową, która będzie odbierać tę intencję, musisz dodać do aplikacji na Androida TV ten predefiniowany filtr intencji: W pliku AndroidManifest.xml dodaj filtr intencji wczytywania do PlayerActivity:

<activity android:name="com.google.sample.cast.castconnect.PlaybackActivity"
          android:launchMode="singleTask"
          android:exported="true">
  <intent-filter>
     <action android:name="com.google.android.gms.cast.tv.action.LOAD"/>
     <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

Obsługa żądań wczytywania na Androidzie TV

Teraz, gdy aktywność jest skonfigurowana do odbierania tego zamiaru zawierającego prośbę o wczytanie, musimy go obsłużyć.

Gdy aktywność się rozpoczyna, aplikacja wywołuje metodę prywatną o nazwie processIntent. Ta metoda zawiera logikę przetwarzania przychodzących intencji. Aby obsłużyć żądanie wczytania, zmodyfikujemy tę metodę i wyślemy intencję do dalszego przetworzenia, wywołując metodę MediaManager instancji onNewIntent. Jeśli MediaManager wykryje, że intencja jest żądaniem wczytania, wyodrębni z niej obiekt MediaLoadRequestData i wywoła MediaLoadCommandCallback.onLoad(). Zmodyfikuj metodę processIntent w pliku PlaybackVideoFragment.kt, aby obsługiwać intencję zawierającą żądanie wczytania:

fun processIntent(intent: Intent?) {
    val mediaManager: MediaManager = CastReceiverContext.getInstance().getMediaManager()
    // Pass intent to Cast SDK
    if (mediaManager.onNewIntent(intent)) {
        return
    }

    // Clears all overrides in the modifier.
    mediaManager.getMediaStatusModifier().clear()

    // If the SDK doesn't recognize the intent, handle the intent with your own logic.
    ...
}

Następnie rozszerzymy klasę abstrakcyjną MediaLoadCommandCallback, która zastąpi metodę onLoad() wywoływaną przez MediaManager. Ta metoda otrzymuje dane z żądania wczytania i konwertuje je na obiekt Movie. Po przekonwertowaniu film jest odtwarzany przez lokalny odtwarzacz. Wartość MediaManager jest następnie aktualizowana o wartość MediaLoadRequest, a wartość MediaStatus jest rozsyłana do połączonych nadawców. Utwórz zagnieżdżoną klasę prywatną o nazwie MyMediaLoadCommandCallback w pliku PlaybackVideoFragment.kt:

import com.google.android.gms.cast.MediaLoadRequestData
import com.google.android.gms.cast.MediaInfo
import com.google.android.gms.cast.MediaMetadata
import com.google.android.gms.cast.MediaError
import com.google.android.gms.cast.tv.media.MediaException
import com.google.android.gms.cast.tv.media.MediaCommandCallback
import com.google.android.gms.cast.tv.media.QueueUpdateRequestData
import com.google.android.gms.cast.tv.media.MediaLoadCommandCallback
import com.google.android.gms.tasks.Task
import com.google.android.gms.tasks.Tasks
import android.widget.Toast
...

private inner class MyMediaLoadCommandCallback :  MediaLoadCommandCallback() {
    override fun onLoad(
        senderId: String?, mediaLoadRequestData: MediaLoadRequestData): Task<MediaLoadRequestData> {
        Toast.makeText(activity, "onLoad()", Toast.LENGTH_SHORT).show()
        return if (mediaLoadRequestData == null) {
            // Throw MediaException to indicate load failure.
            Tasks.forException(MediaException(
                MediaError.Builder()
                    .setDetailedErrorCode(MediaError.DetailedErrorCode.LOAD_FAILED)
                    .setReason(MediaError.ERROR_REASON_INVALID_REQUEST)
                    .build()))
        } else Tasks.call {
            play(convertLoadRequestToMovie(mediaLoadRequestData)!!)
            // Update media metadata and state
            val mediaManager = castReceiverContext!!.mediaManager
            mediaManager.setDataFromLoad(mediaLoadRequestData)
            mediaLoadRequestData
        }
    }
}

private fun convertLoadRequestToMovie(mediaLoadRequestData: MediaLoadRequestData?): Movie? {
    if (mediaLoadRequestData == null) {
        return null
    }
    val mediaInfo: MediaInfo = mediaLoadRequestData.getMediaInfo() ?: return null
    var videoUrl: String = mediaInfo.getContentId()
    if (mediaInfo.getContentUrl() != null) {
        videoUrl = mediaInfo.getContentUrl()
    }
    val metadata: MediaMetadata = mediaInfo.getMetadata()
    val movie = Movie()
    movie.videoUrl = videoUrl
    movie.title = metadata?.getString(MediaMetadata.KEY_TITLE)
    movie.description = metadata?.getString(MediaMetadata.KEY_SUBTITLE)
    if(metadata?.hasImages() == true) {
        movie.cardImageUrl = metadata.images[0].url.toString()
    }
    return movie
}

Po zdefiniowaniu wywołania zwrotnego musimy zarejestrować je w MediaManager. Wywołanie zwrotne musi zostać zarejestrowane przed wywołaniem funkcji MediaManager.onNewIntent(). Dodaj setMediaLoadCommandCallback po zainicjowaniu odtwarzacza:

private fun initializePlayer() {
    if (mPlayer == null) {
        ...
        mMediaSession = MediaSessionCompat(getContext(), LOG_TAG)
        ...
        castReceiverContext = CastReceiverContext.getInstance()
        if (castReceiverContext != null) {
            val mediaManager: MediaManager = castReceiverContext.getMediaManager()
            mediaManager.setSessionCompatToken(mMediaSession.getSessionToken())
            mediaManager.setMediaLoadCommandCallback(MyMediaLoadCommandCallback())
        }
    }
}

Uruchamianie przykładowej aplikacji

Kliknij przycisk Przycisk Uruchom w Android Studio, zielony trójkąt skierowany w prawoUruchom, aby wdrożyć aplikację na urządzeniu ATV. Na urządzeniu nadawcy kliknij przycisk Cast Ikona przycisku Cast i wybierz urządzenie ATV. Aplikacja ATV zostanie uruchomiona na urządzeniu ATV. Wybierz film na urządzeniu mobilnym, a rozpocznie się jego odtwarzanie na ATV. Sprawdź, czy na telefonie, na którym masz elementy sterujące odtwarzaniem, pojawi się powiadomienie. Spróbuj użyć elementów sterujących, np. wstrzymać film na urządzeniu ATV.

7. Obsługa poleceń sterowania przesyłaniem

Obecna aplikacja obsługuje podstawowe polecenia zgodne z sesją multimedialną, takie jak odtwarzanie, wstrzymywanie i przewijanie. Niektóre polecenia sterowania Castem nie są jednak dostępne w sesji multimedialnej. Aby obsługiwać te polecenia sterujące Cast, musisz zarejestrować MediaCommandCallback.

Dodaj MyMediaCommandCallback do instancji MediaManager za pomocą setMediaCommandCallback po zainicjowaniu odtwarzacza:

private fun initializePlayer() {
    ...
    castReceiverContext = CastReceiverContext.getInstance()
    if (castReceiverContext != null) {
        val mediaManager = castReceiverContext!!.mediaManager
        ...
        mediaManager.setMediaCommandCallback(MyMediaCommandCallback())
    }
}

Utwórz klasę MyMediaCommandCallback, aby zastąpić metody, takie jak onQueueUpdate(), i obsługiwać te polecenia sterujące Cast:

private inner class MyMediaCommandCallback : MediaCommandCallback() {
    override fun onQueueUpdate(
        senderId: String?,
        queueUpdateRequestData: QueueUpdateRequestData
    ): Task<Void> {
        Toast.makeText(getActivity(), "onQueueUpdate()", Toast.LENGTH_SHORT).show()
        // Queue Prev / Next
        if (queueUpdateRequestData.getJump() != null) {
            Toast.makeText(
                getActivity(),
                "onQueueUpdate(): Jump = " + queueUpdateRequestData.getJump(),
                Toast.LENGTH_SHORT
            ).show()
        }
        return super.onQueueUpdate(senderId, queueUpdateRequestData)
    }
}

8. Praca ze stanem multimediów

Modyfikowanie stanu multimediów

Cast Connect pobiera podstawowy stan multimediów z sesji multimedialnej. Aby obsługiwać funkcje zaawansowane, aplikacja na Androida TV może określać i zastępować dodatkowe właściwości stanu za pomocą obiektu MediaStatusModifier. MediaStatusModifier będzie zawsze działać w MediaSession, które zostało ustawione w CastReceiverContext.

Na przykład, aby określić setMediaCommandSupported, gdy wywoływane jest wywołanie zwrotne onLoad:

import com.google.android.gms.cast.MediaStatus
...
private class MyMediaLoadCommandCallback : MediaLoadCommandCallback() {
    fun onLoad(
        senderId: String?,
        mediaLoadRequestData: MediaLoadRequestData
    ): Task<MediaLoadRequestData> {
        Toast.makeText(getActivity(), "onLoad()", Toast.LENGTH_SHORT).show()
        ...
        return Tasks.call({
            play(convertLoadRequestToMovie(mediaLoadRequestData)!!)
            ...
            // Use MediaStatusModifier to provide additional information for Cast senders.
            mediaManager.getMediaStatusModifier()
                .setMediaCommandSupported(MediaStatus.COMMAND_QUEUE_NEXT, true)
                .setIsPlayingAd(false)
            mediaManager.broadcastMediaStatus()
            // Return the resolved MediaLoadRequestData to indicate load success.
            mediaLoadRequestData
        })
    }
}

Przechwytywanie MediaStatus przed wysłaniem

Podobnie jak w przypadku MessageInterceptor w pakiecie Web Receiver SDK, możesz określić MediaStatusWriterMediaManager, aby wprowadzić dodatkowe modyfikacje w MediaStatus, zanim zostanie on przesłany do połączonych nadawców.

Możesz na przykład ustawić dane niestandardowe w MediaStatus przed wysłaniem ich do nadawców mobilnych:

import com.google.android.gms.cast.tv.media.MediaManager.MediaStatusInterceptor
import com.google.android.gms.cast.tv.media.MediaStatusWriter
import org.json.JSONObject
import org.json.JSONException
...

private fun initializePlayer() {
    if (mPlayer == null) {
        ...
        if (castReceiverContext != null) {
            ...
            val mediaManager: MediaManager = castReceiverContext.getMediaManager()
            ...
            // Use MediaStatusInterceptor to process the MediaStatus before sending out.
            mediaManager.setMediaStatusInterceptor(
                MediaStatusInterceptor { mediaStatusWriter: MediaStatusWriter ->
                    try {
                        mediaStatusWriter.setCustomData(JSONObject("{myData: 'CustomData'}"))
                    } catch (e: JSONException) {
                        Log.e(LOG_TAG,e.message,e);
                    }
            })
        }
    }
}        

9. Gratulacje

Wiesz już, jak włączyć przesyłanie w aplikacji na Androida TV za pomocą biblioteki Cast Connect.

Więcej informacji znajdziesz w przewodniku dla programistów: /cast/docs/android_tv_receiver.