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

Mit dem folgenden Verfahren können Sie Ihre Android-Sender-App von Cast SDK v2 in CAF-Sender konvertieren. Dies basiert auf dem CastContext-Singleton.

Das Cast CAF Sender SDK verwendet CastContext zur Verwaltung des GoogleAPIClient in deinem Namen. CastContext verwaltet Lebenszyklen, Fehler und Callbacks für dich, was die Entwicklung einer Cast-App erheblich vereinfacht.

Einleitung

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

Abhängigkeiten

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

CAF muss mindestens die Android SDK-Version 9 (Gingerbread) unterstützen.

Initialisierung

In CAF ist ein expliziter Initialisierungsschritt für das Cast-Framework erforderlich. Dazu gehört die Initialisierung des CastContext-Singleton mit einem geeigneten 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;
    }
}

Deklariere OptionsProvider im Tag „application“ der App-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 verzögert in der onCreate-Methode jeder Aktivität:

private CastContext mCastContext;

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

    mCastContext = CastContext.getSharedInstance(this);
}

Diese Schritte waren in Version 2 nicht erforderlich.

Geräteerkennung

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

Cast-Symbol und Streaming-Dialogfeld

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

Das Cast-Symbol wird weiterhin durch die MediaRouteButton implementiert und kann deiner Aktivität (mit ActionBar oder Toolbar) als Menüpunkt in deinem 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"/>

Überschreibe die onCreateOptionMenu()-Methode jeder Aktivität, indem du mithilfe von CastButtonFactory die MediaRouteButton mit dem Cast-Framework verbindest:

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

In CAF wird die Gerätesteuerung weitgehend vom Framework übernommen. Die Absenderanwendung muss die Verbindung zum Gerät und das Starten der Web Receiver-Anwendung mit GoogleApiClient nicht selbst verarbeiten (und sollte dies auch nicht versuchen). Die Interaktion zwischen Sender und Webempfänger wird jetzt als "Sitzung" dargestellt. Die Klasse SessionManager steuert den Sitzungslebenszyklus und startet und beendet Sitzungen als Reaktion auf Nutzergesten: Eine Sitzung wird gestartet, wenn der Nutzer im Streaming-Dialogfeld ein Übertragungsgerät auswählt. Sie wird beendet, wenn der Nutzer im Dialogfeld „Streamen“ auf die Schaltfläche „Streamen beenden“ tippt oder die Sender-App selbst beendet wird. Die Absenderanwendung kann über Sitzungslebenszyklus-Ereignisse informiert werden, indem eine SessionManagerListener mit der SessionManager registriert wird. Die SessionManagerListener-Callbacks definieren Callback-Methoden für alle Sitzungslebenszyklusereignisse.

Die Klasse CastSession steht für eine Sitzung mit einem Übertragungsgerät. Die Klasse bietet Methoden zum Steuern der Gerätelautstärke und zum Stummschalten, wie es bisher in Version 2 mit Methoden in Cast.CastApi möglich war.

In Version 2 wurden über die Cast.Listener-Callbacks Benachrichtigungen über Änderungen des Gerätestatus gesendet, einschließlich Lautstärke, Stummschaltung, Stand-by-Status usw.

In CAF werden Benachrichtigungen über Statusänderungen von Lautstärke/Stummschaltung weiterhin über Callback-Methoden im Cast.Listener gesendet. Diese Listener werden mit CastSession registriert. Alle verbleibenden Gerätestatusbenachrichtigungen werden über CastStateListener-Callbacks gesendet. Diese Listener werden im CastSession registriert. Achten Sie darauf, die Registrierung von Listenern dennoch aufzuheben, wenn die zugehörigen Fragmente, Aktivitäten oder Anwendungen in den Hintergrund gehen.

Logik für die erneute Verbindung

Wie bei v2 versucht CAF, Netzwerkverbindungen wiederherzustellen, die aufgrund eines vorübergehenden WLAN-Signals oder anderer Netzwerkfehler verloren gegangen sind. Dies erfolgt jetzt auf Sitzungsebene. Eine Sitzung kann in den Status "Unterbrochen" wechseln, wenn die Verbindung unterbrochen wird, und in den Status "Verbunden" übergehen, sobald die Verbindung wiederhergestellt ist. Das Framework sorgt dafür, dass die Verbindung zur Web Receiver-Anwendung und alle Cast-Kanäle im Rahmen dieses Prozesses wiederhergestellt wird.

Darüber hinaus fügt CAF auch die automatische Sitzungswiederaufnahme hinzu, die standardmäßig aktiviert ist und über CastOptions deaktiviert werden kann. Wenn die Absender-App während eines laufenden Streams in den Hintergrund gesendet oder (durch Wegwischen oder einen Absturz) beendet wird, versucht das Framework, diese Sitzung fortzusetzen, wenn die Absender-App zum Vordergrund zurückkehrt oder neu gestartet wird. Dies wird automatisch vom SessionManager durchgeführt, das die entsprechenden Callbacks für alle registrierten SessionManagerListener-Instanzen ausgibt.

Registrierung eines benutzerdefinierten Channels

In Version 2 werden benutzerdefinierte Channels, die mit Cast.MessageReceivedCallback implementiert wurden, im Cast.CastApi registriert. In CAF werden benutzerdefinierte Channels stattdessen mit der Instanz CastSession registriert. Die Registrierung kann über die Callback-Methode SessionManagerListener.onSessionStarted erfolgen. Für Medienanwendungen ist es nicht mehr erforderlich, den Mediensteuerungskanal explizit über Cast.CastApi.setMessageReceivedCallbacks zu registrieren. Weitere Informationen finden Sie im folgenden Abschnitt.

Mediensteuerung

Die V2-Klasse RemoteMediaPlayer wurde verworfen und sollte nicht verwendet werden. In CAF wird sie durch die neue Klasse RemoteMediaClient ersetzt, die entsprechende Funktionen in einer einfacheren 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 Medienkanal beim Start der Sitzung, wenn die Webempfängeranwendung, mit der eine Verbindung hergestellt wird, den Medien-Namespace unterstützt.

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

In Version 2 geben alle Medienanfragen, die an RemoteMediaPlayer gesendet werden, über einen PendingResult-Callback ein RemoteMediaPlayer.MediaChannelResult zurück.

In CAF geben alle Medienanfragen, die an RemoteMediaClient gesendet werden, über einen PendingResult-Callback ein RemoteMediaClient.MediaChannelResult zurück, mit dem sich der Fortschritt und das letztendliche Ergebnis der Anfrage verfolgen lassen.

RemoteMediaPlayer von Version 2 würde über RemoteMediaPlayer.OnStatusUpdatedListener Benachrichtigungen über Änderungen am Status des Mediaplayers an den Webempfänger senden.

In CAF stellt RemoteMediaClient entsprechende Callbacks über seine Schnittstelle RemoteMediaClient.Listener bereit. Mit RemoteMediaClient kann eine beliebige Anzahl von Listenern registriert werden. Dadurch können mehrere Absenderkomponenten die einzelne Instanz von RemoteMediaClient teilen, die der Sitzung zugeordnet ist.

In Version 2 musste die Absenderanwendung die Benutzeroberfläche mit dem Status des Mediaplayers auf dem Webempfänger synchron halten.

In CAF übernimmt die Klasse UIMediaController den größten Teil dieser Verantwortung.

Einleitendes Overlay

Version 2 bietet keine einführende Overlay-Benutzeroberfläche.

CAF bietet eine benutzerdefinierte Ansicht IntroductoryOverlay, in der das Cast-Symbol hervorgehoben wird, wenn es Nutzern zum ersten Mal angezeigt wird.

Mini-Controller

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

In CAF bietet das SDK die benutzerdefinierte Ansicht MiniControllerFragment, die Sie der App-Layoutdatei der Aktivitäten hinzufügen können, in denen der Mini-Controller angezeigt werden soll.

Benachrichtigungen und Sperrbildschirm

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

In CAF bietet das SDK eine NotificationsOptions.Builder, mit der Sie Mediensteuerelemente für die Benachrichtigungs- und den Sperrbildschirm in der Absender-App erstellen können. Die Benachrichtigungs- und Sperrbildschirmsteuerelemente können mit dem 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();
}

Maximierter Controller

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

CAF bietet eine UIMediaController-Hilfsklasse, mit der Sie ganz einfach Ihren eigenen erweiterten Controller erstellen können.

CAF fügt ein vordefiniertes erweitertes Controller-Widget ExpandedControllerActivity hinzu, das Sie Ihrer App einfach hinzufü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.

In CAF wird der Audiofokus automatisch verwaltet.

Fehlerprotokollierung

In CAF gibt es keine Logging-Optionen.

Beispiel-Apps und -Anwendungen

Es gibt Codelab-Anleitungen und Beispielanwendungen, die CAF verwenden.