Android Sender App vom Cast SDK v2 zum Cast Application Framework (CAF) migrieren

Mit der folgenden Anleitung können Sie Ihre Android-Absender-App vom Cast SDK v2 auf CAF Sender umstellen, das auf dem Singleton CastContext basiert.

Das Cast CAF Sender SDK verwendet CastContext, um den GoogleAPIClient in Ihrem Namen zu verwalten. CastContext verwaltet Lebenszyklen, Fehler und Callbacks für Sie, was die Entwicklung einer Cast-App erheblich vereinfacht.

Einführung

  • CAF Sender wird weiterhin als Teil der Google Play-Dienste über den Android SDK Manager bereitgestellt.
  • Es wurden neue Pakete hinzugefügt, die für die Einhaltung der Google Cast-Design-Checkliste (com.google.android.gms.cast.framework.*) verantwortlich sind.
  • CAF Sender bietet Widgets, die den Cast-UX-Anforderungen entsprechen. In Version 2 waren keine UI-Komponenten enthalten und Sie mussten diese Widgets selbst implementieren.
  • Die Verwendung von GoogleApiClient ist für die Verwendung der Cast API nicht mehr erforderlich.
  • Die Untertitelung in CAF Sender ähnelt der in Version 2.

Abhängigkeiten

V2 und CAF haben dieselben Abhängigkeiten von den Support-Bibliotheken und Google Play-Diensten (9.2.0 oder höher) wie im Leitfaden zu Support-Bibliotheksfunktionen beschrieben.

Die Mindestversion des Android SDK, die von CAF unterstützt wird, ist 9 (Gingerbread).

Initialisierung

Im CAF ist ein expliziter Initialisierungsschritt für das Cast-Framework erforderlich. Dazu muss das CastContext-Singleton initialisiert werden. Verwenden Sie dazu ein geeignetes OptionsProvider, um die Web Receiver-Anwendungs-ID und alle anderen globalen Optionen anzugeben.

public class CastOptionsProvider implements OptionsProvider {

    @Override
    public CastOptions getCastOptions(Context context) {
        return new CastOptions.Builder()
                .setReceiverApplicationId(context.getString(R.string.app_id))
                .build();
    }

    @Override
    public List<SessionProvider> getAdditionalSessionProviders(Context context) {
        return null;
    }
}

Deklarieren Sie OptionsProvider im Tag „application“ der Datei AndroidManifest.xml:

<application>
...
    <meta-data
        android:name=
            "com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
        android:value="com.google.sample.cast.refplayer.CastOptionsProvider" />
</application>

Initialisieren Sie CastContext in der Methode onCreate jeder Aktivität verzögert:

private CastContext mCastContext;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.video_browser);
    setupActionBar();

    mCastContext = CastContext.getSharedInstance(this);
}

In Version 2 waren diese Schritte nicht erforderlich.

Geräteerkennung

Im CAF wird der Erkennungsprozess automatisch vom Framework gestartet und beendet, wenn die App in den Vordergrund bzw. in den Hintergrund wechselt. MediaRouteSelector und MediaRouter.Callback sollten nicht verwendet werden.

Cast-Symbol und Cast-Dialogfeld

Wie in Version 2 werden diese Komponenten von der MediaRouter-Supportbibliothek bereitgestellt.

Das Cast-Symbol wird weiterhin von MediaRouteButton implementiert und kann Ihrer Aktivität (entweder mit ActionBar oder Toolbar) als Menüpunkt in Ihrem Menü hinzugefügt werden.

<item
    android:id="@+id/media_route_menu_item"
    android:title="@string/media_route_menu_title"
    app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
    app:showAsAction="always"/>

Überschreiben Sie die onCreateOptionMenu()-Methode jeder Aktivität mit CastButtonFactory, um MediaRouteButton mit dem Cast-Framework zu verbinden:

private MenuItem mediaRouteMenuItem;

public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.browse, menu);
    mediaRouteMenuItem =
        CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
                                                menu,
                                                R.id.media_route_menu_item);
    return true;
}

Wenn jemand auf die Schaltfläche tippt, wird automatisch das Cast-Dialogfeld angezeigt.

Gerätesteuerung

Im CAF wird die Gerätesteuerung größtenteils vom Framework übernommen. Die Senderanwendung muss die Verbindung zum Gerät und das Starten der Web Receiver-Anwendung mit GoogleApiClient nicht verarbeiten (und sollte es auch nicht versuchen). Die Interaktion zwischen Absender und Web Receiver wird jetzt als „Sitzung“ dargestellt. Die Klasse SessionManager verarbeitet den Sitzungslebenszyklus und startet und beendet Sitzungen automatisch als Reaktion auf Nutzeraktionen: Eine Sitzung wird gestartet, wenn der Nutzer im Cast-Dialogfeld ein Cast-Gerät auswählt, und beendet, wenn der Nutzer im Cast-Dialogfeld auf die Schaltfläche „Streaming beenden“ tippt oder wenn die Sender-App selbst beendet wird. Die Senderanwendung kann über Lebenszyklusereignisse für Sitzungen benachrichtigt werden, indem sie eine SessionManagerListener bei SessionManager registriert. Die SessionManagerListener-Callbacks definieren Callback-Methoden für alle Ereignisse im Sitzungslebenszyklus.

Die Klasse CastSession stellt eine Sitzung mit einem Cast-Gerät dar. Die Klasse enthält Methoden zum Steuern der Gerätelautstärke und des Stummschaltungsstatus. In v2 wurde dies mit Methoden für Cast.CastApi erledigt.

In Version 2 wurden mit den Cast.Listener-Callbacks Benachrichtigungen über Änderungen am Gerätestatus bereitgestellt, z. B. Lautstärke, Stummschaltungsstatus und Standby-Status.

Im CAF werden Benachrichtigungen über Änderungen des Lautstärke-/Stummschaltungsstatus weiterhin über Callback-Methoden in Cast.Listener gesendet. Diese Listener werden mit CastSession registriert. Alle verbleibenden Benachrichtigungen zum Gerätestatus werden über CastStateListener-Callbacks gesendet. Diese Listener werden bei CastSession registriert. Denken Sie daran, Listener zu entfernen, wenn die zugehörigen Fragmente, Aktivitäten oder Apps in den Hintergrund verschoben werden.

Logik für die Wiederherstellung der Verbindung

Wie bei Version 2 versucht CAF, Netzwerkverbindungen wiederherzustellen, die aufgrund eines vorübergehenden Verlusts des WLAN-Signals oder anderer Netzwerkfehler unterbrochen wurden. Das erfolgt jetzt auf Sitzungsebene. Eine Sitzung kann in den Status „Angehalten“ wechseln, wenn die Verbindung unterbrochen wird, und wieder in den Status „Verbunden“ zurückkehren, wenn die Verbindung wiederhergestellt wird. Das Framework kümmert sich darum, die Verbindung zur Web Receiver-Anwendung und zu allen Cast-Kanälen wiederherzustellen.

Außerdem bietet CAF eine automatische Wiederaufnahme von Sitzungen, die standardmäßig aktiviert ist und über CastOptions deaktiviert werden kann. Wenn die Senderanwendung in den Hintergrund verschoben oder beendet wird (durch Schließen der App oder aufgrund eines Absturzes), während eine Cast-Sitzung läuft, versucht das Framework, die Sitzung fortzusetzen, wenn die Senderanwendung in den Vordergrund zurückkehrt oder neu gestartet wird. Dies wird automatisch von SessionManager verarbeitet, das die entsprechenden Callbacks für alle registrierten SessionManagerListener-Instanzen ausgibt.

Registrierung benutzerdefinierter Channels

In Version 2 werden benutzerdefinierte Channels (die mit Cast.MessageReceivedCallback implementiert werden) bei Cast.CastApi registriert. Im CAF werden benutzerdefinierte Channels stattdessen bei der CastSession-Instanz registriert. Die Registrierung kann in der Callback-Methode SessionManagerListener.onSessionStarted erfolgen. Bei Media-Apps ist es nicht mehr erforderlich, den Media-Steuerkanal explizit über Cast.CastApi.setMessageReceivedCallbacks zu registrieren. Weitere Informationen finden Sie im folgenden Abschnitt.

Mediensteuerung

Die v2-Klasse RemoteMediaPlayer ist veraltet und sollte nicht verwendet werden. Im CAF wird sie durch die neue Klasse RemoteMediaClient ersetzt, die entsprechende Funktionen in einer praktischeren API bietet. Es ist nicht erforderlich, dieses Objekt explizit zu initialisieren oder zu registrieren. Das Framework instanziiert das Objekt automatisch und registriert den zugrunde liegenden Media-Channel beim Start der Sitzung, wenn die Web Receiver-Anwendung, mit der eine Verbindung hergestellt wird, den Media-Namespace unterstützt.

Auf die RemoteMediaClient kann als getRemoteMediaClient-Methode des CastSession-Objekts zugegriffen werden.

In Version 2 wird für alle Media-Anfragen, die für RemoteMediaPlayer ausgegeben werden, über einen PendingResult-Callback ein RemoteMediaPlayer.MediaChannelResult zurückgegeben.

In CAF geben alle Media-Anfragen, die für RemoteMediaClient ausgegeben werden, über einen PendingResult-Callback ein RemoteMediaClient.MediaChannelResult zurück. Dieser kann verwendet werden, um den Fortschritt und das endgültige Ergebnis der Anfrage zu verfolgen.

Mit der v2-Version von RemoteMediaPlayer wurden Benachrichtigungen über Änderungen am Status des Media-Players im Web Receiver über RemoteMediaPlayer.OnStatusUpdatedListener gesendet.

In CAF bietet RemoteMediaClient entsprechende Callbacks über die Schnittstelle RemoteMediaClient.Listener. Beliebig viele Listener können mit dem RemoteMediaClient registriert werden. So können mehrere Senderkomponenten die einzelne Instanz von RemoteMediaClient nutzen, die der Sitzung zugeordnet ist.

In Version 2 musste die Senderanwendung die Benutzeroberfläche mit dem Status des Media Players auf dem Web Receiver synchronisieren.

Im CAF übernimmt die Klasse UIMediaController einen Großteil dieser Verantwortung.

Einführungs-Overlay

In Version 2 gibt es keine UI für das Einführungs-Overlay.

CAF bietet eine benutzerdefinierte Ansicht IntroductoryOverlay, um die Cast-Schaltfläche hervorzuheben, wenn sie Nutzern zum ersten Mal angezeigt wird.

Mini-Controller

In Version 2 müssen Sie einen Mini-Controller von Grund auf in der Sender-App implementieren.

Im CAF stellt das SDK eine benutzerdefinierte Ansicht bereit, MiniControllerFragment, die Sie der App-Layoutdatei der Aktivitäten hinzufügen können, in denen Sie den Mini-Controller anzeigen möchten.

Benachrichtigungen und Sperrbildschirm

In Version 2 werden Controller für Benachrichtigungen und den Sperrbildschirm nicht vom SDK bereitgestellt. Für dieses SDK müssen Sie diese Funktionen mithilfe der Android-Framework-APIs in Ihre Sender-App einbauen.

Im CAF bietet das SDK eine NotificationsOptions.Builder, mit der Sie Mediensteuerelemente für die Benachrichtigung und den Sperrbildschirm in die Sender-App einbauen können. Die Benachrichtigungs- und Sperrbildschirmsteuerelemente können mit der CastOptions beim Initialisieren von CastContext aktiviert werden.

public CastOptions getCastOptions(Context context) {
    NotificationOptions notificationOptions = new NotificationOptions.Builder()
            .setTargetActivityClassName(VideoBrowserActivity.class.getName())
            .build();
    CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
            .setNotificationOptions(notificationOptions)
            .build();

    return new CastOptions.Builder()
            .setReceiverApplicationId(context.getString(R.string.app_id))
            .setCastMediaOptions(mediaOptions)
            .build();
}

Erweiterter Controller

In Version 2 müssen Sie einen maximierten Controller von Grund auf in der Sender-App implementieren.

Das CAF bietet die Hilfsklasse UIMediaController, mit der Sie ganz einfach einen eigenen erweiterten Controller erstellen können.

Mit CAF wird ein vorgefertigtes Widget für den erweiterten Controller ExpandedControllerActivity hinzugefügt, das Sie einfach in Ihre App einfügen können. Sie müssen keinen benutzerdefinierten erweiterten Controller mehr mit UIMediaController implementieren.

Audiofokus

In Version 2 müssen Sie MediaSessionCompat verwenden, um den Audiofokus zu verwalten.

Im CAF wird der Audiofokus automatisch verwaltet.

Fehlerprotokollierung

Im CAF gibt es keine Logging-Optionen.

Beispielanwendungen

Wir haben Codelab-Anleitungen und Beispiel-Apps, die CAF verwenden.