Für Google Cast optimierte Android TV-App

1. Überblick

Google Cast-Logo

In diesem Codelab erfährst du, wie du eine bestehende Android TV-App so modifizierst, dass sie das Streamen und die Kommunikation von deinen bestehenden Apps für Cast-Sender unterstützt.

Was sind Google Cast und Cast Connect?

Mit Google Cast können Nutzer Inhalte von einem Mobilgerät auf einen Fernseher streamen. Eine typische Google Cast-Sitzung besteht aus zwei Komponenten: einer Absender-App und einer Empfänger-App. Sender-Apps, wie mobile Apps oder Websites wie YouTube.com, initiieren und steuern die Wiedergabe einer Cast-Receiver-App. Cast-Receiver-Apps sind HTML 5-Apps, die auf Chromecast- und Android TV-Geräten ausgeführt werden.

Fast der gesamte Status einer Übertragungssitzung wird in der App des Empfängers gespeichert. Wenn der Status aktualisiert wird, z. B. beim Laden eines neuen Medienelements, wird ein Medienstatus an alle Absender gesendet. Diese Übertragungen enthalten den aktuellen Status der Streamingsitzung. Senderanwendungen verwenden diesen Medienstatus, um Wiedergabeinformationen auf ihrer Benutzeroberfläche anzuzeigen.

Cast Connect basiert auf dieser Infrastruktur, wobei Ihre Android TV App als Empfänger fungiert. Mithilfe der Cast Connect-Bibliothek kann Ihre Android TV App Nachrichten empfangen und den Medienstatus übertragen, als wäre sie eine Streamingempfänger-App.

Ziele

Wenn du dieses Codelab abgeschlossen hast, kannst du die Cast-Sender-Apps verwenden, um Videos in eine Android TV-App zu streamen. Die Android TV App kann auch über das Cast-Protokoll mit Absender-Apps kommunizieren.

Lerninhalte

  • So fügen Sie die Cast Connect-Mediathek einer ATV-Beispiel-App hinzu
  • So verbinden Sie einen Cast-Sender und starten die ATV App.
  • Initiieren der Medienwiedergabe in der ATV App über eine Cast-Sender-App
  • Medienstatus von der ATV App an Streaming-Sender-Apps senden

Voraussetzungen

2. Beispielcode abrufen

Sie können den gesamten Beispielcode auf Ihren Computer herunterladen...

und entpacken Sie die heruntergeladene ZIP-Datei.

3. Beispiel-App ausführen

Sehen wir uns zuerst an, wie die fertige Beispiel-App aussieht. Die Android TV-App verwendet die Leanback-Benutzeroberfläche und einen einfachen Videoplayer. Der Nutzer kann ein Video aus einer Liste auswählen und anschließend auf dem Fernseher wiedergeben. Mit der zugehörigen mobilen Sender-App können Nutzer auch ein Video in die Android TV App streamen.

Bild einer Reihe von Video-Thumbnails (eines davon ist hervorgehoben) über der Vollbildvorschau eines Videos; die Worte „Cast Connect“ oben rechts

Entwicklergeräte registrieren

Um Cast Connect-Funktionen für die App-Entwicklung zu aktivieren, müssen Sie die Seriennummer des integrierten Chromecast des Android TV-Geräts, den Sie verwenden, in der Cast-Entwicklerkonsole registrieren. Die Seriennummer finden Sie auf Ihrem Android TV unter Einstellungen > Geräteeinstellungen > Integrierte Chromecast-Technologie > Seriennummer. Diese unterscheidet sich von der Seriennummer Ihres physischen Geräts und muss über die oben beschriebene Methode abgerufen werden.

Abbildung eines Android TV-Bildschirms mit dem Bildschirm „Chromecast integriert“, der Versionsnummer und der Seriennummer

Ohne Registrierung funktioniert Cast Connect aus Sicherheitsgründen nur für Apps, die über den Google Play Store installiert wurden. Starten Sie Ihr Gerät 15 Minuten nach Beginn des Registrierungsvorgangs neu.

Android-Sender-App installieren

Um das Senden von Anfragen von einem Mobilgerät aus zu testen, stellen wir eine einfache Senderanwendung namens "Videos streamen" als mobile-sender-0629.apk-Datei in der ZIP-Datei mit dem Quellcode bereit. Wir werden ADB nutzen, um das APK zu installieren. Wenn Sie bereits eine andere Version von "Videos streamen" installiert haben, deinstallieren Sie diese Version von allen Profilen auf dem Gerät, bevor Sie fortfahren.

  1. Aktivieren Sie Entwickleroptionen und USB-Debugging auf Ihrem Android-Smartphone.
  2. Schließen Sie ein USB-Datenkabel an, um Ihr Android-Smartphone mit dem Entwicklungscomputer zu verbinden.
  3. Installiere mobile-sender-0629.apk auf deinem Android-Smartphone.

Bild eines Terminalfensters, in dem der Befehl „adb install“ zur Installation von „mobile-sender.apk“ ausgeführt wird

  1. Sie finden die Absender-App Videos streamen auf Ihrem Android-Smartphone. Symbol der App „Sender streamen“

Bild der App zum Senden von Videos, die auf einem Android-Smartphone ausgeführt wird

Android TV App installieren

In der folgenden Anleitung wird beschrieben, wie Sie die fertige Beispiel-App in Android Studio öffnen und ausführen:

  1. Wählen Sie auf der Willkommensseite Projekt importieren oder in den Menüoptionen Datei > Neu > Projekt importieren... aus.
  2. Wählen Sie im Ordner mit dem Beispielcode das Verzeichnis Ordnersymbolapp-done aus und klicken Sie auf „OK“.
  3. Klicken Sie auf Datei > Synchronisierungsprojekt mit Gradle-Schaltfläche von Android App Studio Projekt mit Gradle-Dateien synchronisieren.
  4. Aktivieren Sie Entwickleroptionen und USB-Debugging auf Ihrem Android TV-Gerät.
  5. ADB mit deinem Android TV-Gerät verbinden – das Gerät sollte in Android Studio angezeigt werden. Bild, das das Android TV-Gerät in der Symbolleiste von Android Studio zeigt
  6. Klicken Sie auf die Schaltfläche Schaltfläche „Ausführen“ in Android Studio, ein grünes Dreieck, das nach rechts zeigtAusführen. Nach einigen Sekunden sollte die ATV-App Cast Connect Codelab erscheinen.

Cast Connect mit der ATV App abspielen

  1. Rufen Sie den Android TV-Startbildschirm auf.
  2. Öffnen Sie die App zum Senden von Videos auf Ihrem Android-Smartphone. Klicke auf das Cast-Symbol Symbol für das Cast-Symbol und wähle dein Quad-Gerät aus.
  3. Die Cast Connect Codelab ATV App wird auf Ihrem ATV gestartet und das Cast-Symbol auf Ihrem Sender zeigt an, dass sie verbunden ist Symbol für das Cast-Symbol mit umgekehrten Farben.
  4. Wählen Sie in der ATV App ein Video aus. Es wird auf Ihrem ATV abgespielt.
  5. Auf deinem Smartphone ist jetzt unten in der Sender-App ein Mini-Controller sichtbar. Du kannst die Wiedergabe mit der Wiedergabe-/Pausetaste steuern.
  6. Wähle ein Video auf dem Smartphone aus und starte die Wiedergabe. Das Video wird auf dem Quad-Lautsprecher abgespielt und der erweiterte Controller wird auf dem mobilen Sender angezeigt.
  7. Wenn Sie Ihr Smartphone sperren, sollten Sie auf dem Sperrbildschirm eine Benachrichtigung sehen, über die Sie die Medienwiedergabe steuern oder das Streaming beenden können.

Bild eines Abschnitts des Displays eines Android-Smartphones mit einem Miniplayer, der ein Video abspielt

4. Startprojekt vorbereiten

Nachdem wir nun die Cast Connect-Integration der App abgeschlossen haben, müssen wir die heruntergeladene Start-App für Cast Connect unterstützen. Jetzt können Sie mit Android Studio auf dem Startprojekt aufbauen:

  1. Wählen Sie auf der Willkommensseite Projekt importieren oder in den Menüoptionen Datei > Neu > Projekt importieren... aus.
  2. Wählen Sie im Ordner mit dem Beispielcode das Verzeichnis Ordnersymbolapp-start aus und klicken Sie auf „OK“.
  3. Klicken Sie auf Datei > Android Studio-Schaltfläche „Projekt mit Gradle synchronisieren“ Projekt mit Gradle-Dateien synchronisieren.
  4. Wählen Sie „ATV-Gerät“ aus und klicken Sie auf die Schaltfläche Schaltfläche „Ausführen“ in Android Studio, ein grünes Dreieck, das nach rechts zeigtAusführen, um die App auszuführen und sich die Benutzeroberfläche anzusehen. Symbolleiste von Android Studio mit dem ausgewählten Android TV-Gerät

Bild einer Reihe von Video-Thumbnails (eines davon ist hervorgehoben) über der Vollbildvorschau eines Videos; die Worte „Cast Connect“ oben rechts

App-Design

Die App stellt eine Liste mit Videos bereit, die der Nutzer durchsuchen kann. Nutzer können ein Video zur Wiedergabe auf Android TV auswählen. Die App besteht aus zwei Hauptaktivitäten: MainActivity und PlaybackActivity.

MainActivity

Diese Aktivität enthält ein Fragment (MainFragment). Die Liste der Videos und die zugehörigen Metadaten werden in der Klasse MovieList konfiguriert und die Methode setupMovies() wird aufgerufen, um eine Liste von Movie-Objekten zu erstellen.

Ein Movie-Objekt repräsentiert ein Videoelement mit Titel, Beschreibung, Miniaturansichten des Bildes und Video-URL. Jedes Movie-Objekt ist an ein CardPresenter-Objekt gebunden, um das Video-Thumbnail mit Titel und Studio zu präsentieren und an ArrayObjectAdapter zu übergeben.

Wenn ein Element ausgewählt wird, wird das entsprechende Movie-Objekt an PlaybackActivity übergeben.

PlaybackActivity

Diese Aktivität enthält ein Fragment (PlaybackVideoFragment), das ein VideoView mit ExoPlayer, einigen Mediensteuerelementen und einem Textbereich für die Beschreibung des ausgewählten Videos hostet. Hier kann der Nutzer das Video auf Android TV abspielen. Der Nutzer kann die Fernbedienung verwenden, um Videos abzuspielen/zu pausieren oder zu suchen.

Voraussetzungen für Cast Connect

Für Cast Connect werden neue Versionen der Google Play-Dienste verwendet, für die Ihre ATV App auf den AndroidX-Namespace aktualisiert wurde.

Damit Cast Connect in Ihrer Android TV App unterstützt werden kann, müssen Sie Ereignisse aus einer Mediensitzung erstellen und unterstützen. Die Cast Connect-Bibliothek generiert den Medienstatus anhand des Status der Mediensitzung. Ihre Mediensitzung wird auch von der Cast Connect-Bibliothek verwendet, um zu signalisieren, wenn bestimmte Nachrichten von einem Absender eingegangen sind, z. B. eine Pause.

5. Cast-Unterstützung konfigurieren

Abhängigkeiten

Aktualisieren Sie die Datei build.gradle der Anwendung, um die erforderlichen Bibliotheksabhängigkeiten hinzuzufügen:

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'
}

Synchronisieren Sie das Projekt, um zu prüfen, ob das Projekt fehlerfrei erstellt wird.

Initialisierung

CastReceiverContext ist ein Singleton-Objekt zur Koordinierung aller Cast-Interaktionen. Sie müssen die Schnittstelle ReceiverOptionsProvider implementieren, um CastReceiverOptions bereitzustellen, wenn CastReceiverContext initialisiert wird.

Erstellen Sie die Datei CastReceiverOptionsProvider.kt und fügen Sie dem Projekt die folgende Klasse hinzu:

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()
    }
}

Geben Sie dann den Anbieter für Empfängeroptionen im Tag <application> der Datei AndroidManifest.xml der App an:

<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>

Wenn du vom Cast-Sender eine Verbindung zu deiner ATV App herstellen möchtest, wähle die Aktivität aus, die du starten möchtest. In diesem Codelab starten wir MainActivity der App, wenn eine Streaming-Sitzung gestartet wird. Fügen Sie in der Datei AndroidManifest.xml im MainActivity den Start-Intent-Filter hinzu.

<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>

Kontextlebenszyklus des Streamingempfängers

Du solltest CastReceiverContext starten, wenn deine App gestartet wird, und CastReceiverContext beenden, wenn die App in den Hintergrund verschoben wird. Wir empfehlen, LifecycleObserver aus der androidx.lifecycle-Bibliothek zu verwenden, um die Aufrufe von CastReceiverContext.start() und CastReceiverContext.stop() zu verwalten

Öffnen Sie die Datei MyApplication.kt und initialisieren Sie den Cast-Kontext, indem Sie initInstance() in der onCreate-Methode der Anwendung aufrufen. In der AppLifeCycleObserver-Klasse start() die CastReceiverContext, wenn die Anwendung fortgesetzt wird, und stop() sie, wenn sie pausiert wird:

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()
        }
    }
}

MediaSession mit MediaManager verbinden

MediaManager ist eine Property des Singleton-Elements CastReceiverContext. Sie verwaltet den Medienstatus, verarbeitet den Lade-Intent, wandelt die Medien-Namespace-Nachrichten von den Absendern in Medienbefehle um und sendet den Medienstatus an die Absender zurück.

Wenn Sie ein MediaSession erstellen, müssen Sie auch das aktuelle MediaSession-Token an MediaManager übergeben, damit es weiß, wohin die Befehle gesendet und der Status der Medienwiedergabe abgerufen werden soll. Achten Sie in der Datei PlaybackVideoFragment.kt darauf, dass MediaSession initialisiert wird, bevor Sie das Token auf MediaManager setzen.

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())
            }

        }
    }
}

Wenn du MediaSession aufgrund einer inaktiven Wiedergabe freigibst, solltest du für MediaManager ein Null-Token festlegen:

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

Beispiel-App ausführen

Klicken Sie auf die Schaltfläche Schaltfläche „Ausführen“ in Android Studio, ein grünes Dreieck, das nach rechts zeigtAusführen, um die App auf Ihrem ATV-Gerät bereitzustellen, schließen Sie sie und kehren Sie zum ATV-Startbildschirm zurück. Klicken Sie bei Ihrem Sender auf das Cast-Symbol Symbol für das Cast-Symbol und wählen Sie Ihr Quad-Gerät aus. Die ATV App wird auf dem Quad-Gerät gestartet und die Übertragungsschaltfläche ist verbunden.

6. Medien werden geladen

Der Ladebefehl wird über einen Intent mit dem Paketnamen gesendet, den Sie in der Entwicklerkonsole definiert haben. Fügen Sie Ihrer Android TV-App den folgenden vordefinierten Intent-Filter hinzu, um die Zielaktivität anzugeben, die diesen Intent erhalten soll. Fügen Sie in der Datei AndroidManifest.xml den Lade-Intent-Filter zu PlayerActivity hinzu:

<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>

Ladeanfragen auf Android TV verarbeiten

Nachdem die Aktivität so konfiguriert ist, dass sie diesen Intent mit einer Ladeanfrage empfängt, müssen wir sie verarbeiten.

Die App ruft eine private Methode namens processIntent auf, wenn die Aktivität beginnt. Diese Methode enthält die Logik für die Verarbeitung eingehender Intents. Zum Verarbeiten einer Ladeanfrage ändern wir diese Methode und senden den Intent zur weiteren Verarbeitung durch Aufrufen der Methode onNewIntent der MediaManager-Instanz. Wenn MediaManager erkennt, dass der Intent eine Ladeanfrage ist, wird das MediaLoadRequestData-Objekt aus dem Intent extrahiert und MediaLoadCommandCallback.onLoad() aufgerufen. Ändern Sie die Methode processIntent in der Datei PlaybackVideoFragment.kt so, dass der Intent verarbeitet wird, der die Ladeanfrage enthält:

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.
    ...
}

Als Nächstes erweitern wir die abstrakte Klasse MediaLoadCommandCallback, die die von MediaManager aufgerufene onLoad()-Methode überschreibt. Diese Methode empfängt die Daten der Ladeanfrage und konvertiert sie in ein Movie-Objekt. Nach der Konvertierung wird der Film vom lokalen Player abgespielt. Die MediaManager wird dann mit der MediaLoadRequest aktualisiert und sendet die MediaStatus an die verbundenen Absender. Erstellen Sie eine verschachtelte private Klasse mit dem Namen MyMediaLoadCommandCallback in der Datei 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
}

Nachdem der Callback definiert wurde, müssen wir ihn bei MediaManager registrieren. Der Callback muss registriert werden, bevor MediaManager.onNewIntent() aufgerufen wird. Füge setMediaLoadCommandCallback hinzu, wenn der Player initialisiert wird:

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())
        }
    }
}

Beispiel-App ausführen

Klicken Sie auf die Schaltfläche Schaltfläche „Ausführen“ in Android Studio, ein grünes Dreieck, das nach rechts zeigtAusführen, um die App auf Ihrem ATV-Gerät bereitzustellen. Klicken Sie bei Ihrem Sender auf das Cast-Symbol Symbol für das Cast-Symbol und wählen Sie Ihr Quad-Gerät aus. Die ATV-App wird auf dem Quad-Gerät gestartet. Wähle ein Video auf einem Mobilgerät aus. Die Wiedergabe des Videos wird auf dem ATV gestartet. Prüfen Sie, ob Sie auf Ihrem Smartphone eine Benachrichtigung erhalten, auf der sich die Wiedergabesteuerung befindet. Verwenden Sie z. B. Steuerelemente wie „Pause“ oder „Video auf dem Quad-Gerät“.

7. Unterstützung von Befehlen für die Cast-Steuerung

Die aktuelle App unterstützt jetzt grundlegende Befehle, die mit einer Mediensitzung kompatibel sind, z. B. Wiedergabe, Pause und Suchen. Es gibt jedoch einige Befehle für die Streamingsteuerung, die in der Mediensitzung nicht verfügbar sind. Du musst ein MediaCommandCallback registrieren, um diese Befehle für die Cast-Steuerung zu unterstützen.

Füge der MediaManager-Instanz mit setMediaCommandCallback MyMediaCommandCallback hinzu, wenn der Player initialisiert wird:

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

Erstellen Sie die MyMediaCommandCallback-Klasse, um die Methoden zu überschreiben, z. B. onQueueUpdate(), um diese Steuerungsbefehle für das Cast zu unterstützen:

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. Arbeiten mit Medienstatus

Medienstatus ändern

Cast Connect ruft den Basismedienstatus aus der Mediensitzung ab. Zur Unterstützung erweiterter Funktionen kann deine Android TV-App zusätzliche Statuseigenschaften über eine MediaStatusModifier angeben und überschreiben. MediaStatusModifier wird immer für die MediaSession ausgeführt, die Sie in CastReceiverContext festgelegt haben.

So geben Sie beispielsweise setMediaCommandSupported an, wenn der onLoad-Callback ausgelöst wird:

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
        })
    }
}

MediaStatus vor dem Senden abfangen

Ähnlich wie bei MessageInterceptor des Web Receiver SDK kannst du einen MediaStatusWriter in deinem MediaManager angeben, um zusätzliche Änderungen an deinem MediaStatus vorzunehmen, bevor sie an die verbundenen Absender gesendet werden.

Sie können beispielsweise benutzerdefinierte Daten in der MediaStatus festlegen, bevor Sie sie an mobile Absender senden:

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. Glückwunsch

Jetzt wissen Sie, wie Sie eine Android TV-App mithilfe der Cast Connect-Bibliothek für Google Cast aktivieren.

Weitere Informationen findest du im Entwicklerleitfaden: /cast/docs/android_tv_receiver.