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, der auf dem Singleton CastContext basiert.

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

Einleitung

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

Abhängigkeiten

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

Die Mindestversion des von CAF unterstützten Android SDK ist 9 (Gingerbread).

Initialisierung

In CAF ist ein expliziter Initialisierungsschritt für das Cast-Framework erforderlich. Dazu gehört die Initialisierung des Singleton-Elements CastContext mit einem geeigneten OptionsProvider, um die ID der Web Receiver-Anwendung 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 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 langsam 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 v2 nicht erforderlich.

Geräteerkennung

In CAF wird der Erkennungsprozess vom Framework automatisch gestartet und gestoppt, 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 vom MediaRouteButton implementiert und kann deinen Aktivitäten als Menüelement in deinem Menü über ActionBar oder Toolbar 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 Methode onCreateOptionMenu() jeder Aktivität, indem Sie CastButtonFactory verwenden, um das 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

Bei CAF wird die Gerätesteuerung weitgehend vom Framework übernommen. Die Senderanwendung muss keine Verbindung zum Gerät verarbeiten (und sollte auch nicht versuchen), dies zu tun und die Web Receiver-Anwendung mit GoogleApiClient zu starten. Die Interaktion zwischen Sender und Webempfänger wird jetzt als „Sitzung“ dargestellt. Die Klasse SessionManager steuert den Sitzungslebenszyklus und startet und beendet Sitzungen automatisch als Reaktion auf Nutzergesten: Eine Sitzung wird gestartet, wenn der Nutzer im Streaming-Dialogfeld ein Übertragungsgerät auswählt, und wird 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 durch Registrieren eines SessionManagerListener mit der SessionManager über Sitzungslebenszyklusereignisse benachrichtigt werden. Die SessionManagerListener-Callbacks definieren Callback-Methoden für alle Lebenszyklusereignisse einer Sitzung.

Die Klasse CastSession steht für eine Sitzung mit einem Übertragungsgerät. Die Klasse bietet Methoden zur Steuerung der Gerätelautstärke und der Stummschaltung, was zuvor in Version 2 mit Methoden für Cast.CastApi erfolgte.

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

In CAF werden Benachrichtigungen über Lautstärke-/Stummschaltungsänderungen weiterhin über Callback-Methoden im Cast.Listener gesendet. Diese Listener werden mit CastSession registriert. Alle verbleibenden Gerätestatusbenachrichtigungen werden über CastStateListener-Callbacks bereitgestellt. Diese Listener werden bei CastSession registriert. Die Registrierung von Listenern muss auch dann aufgehoben sein, wenn die zugehörigen Fragmente, Aktivitäten oder Anwendungen in den Hintergrund verschoben werden.

Logik für die erneute Verbindung

Wie bei v2 versucht CAF, Netzwerkverbindungen wiederherzustellen, die aufgrund eines vorübergehenden Verlusts des WLAN-Signals oder anderer Netzwerkfehler unterbrochen wurden. Dies erfolgt jetzt auf Sitzungsebene. Eine Sitzung kann in den Status „Ausgesetzt“ wechseln, wenn die Verbindung unterbrochen wird, und wieder in den Status „Verbunden“ wechseln, wenn die Verbindung wiederhergestellt wird. Das Framework sorgt dafür, dass die Verbindung zur Web Receiver-App und allen Cast-Kanälen wiederhergestellt wird.

Darüber hinaus fügt CAF eine automatische Sitzungswiederaufnahme hinzu, die standardmäßig aktiviert ist und über CastOptions deaktiviert werden kann. Wenn die Senderanwendung während einer Cast-Sitzung in den Hintergrund gesendet oder durch Wegwischen oder durch einen Absturz beendet wird, versucht das Framework, diese Sitzung fortzusetzen, wenn die Senderanwendung in den Vordergrund zurückkehrt oder neu gestartet wird. Dies wird automatisch von SessionManager ausgeführt, das die entsprechenden Callbacks auf allen registrierten SessionManagerListener-Instanzen ausgibt.

Registrierung eines benutzerdefinierten Kanals

In Version 2 werden benutzerdefinierte Channels (mit Cast.MessageReceivedCallback implementiert) bei der Cast.CastApi registriert. In CAF werden benutzerdefinierte Channels stattdessen mit der Instanz CastSession registriert. Die Registrierung kann in der 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 eingestellt und sollte nicht mehr verwendet werden. In CAF wird sie durch die neue Klasse RemoteMediaClient ersetzt, die gleichwertige Funktionen in einer praktischeren API bietet. Dieses Objekt muss nicht explizit initialisiert oder registriert werden. Das Framework instanziiert das Objekt automatisch und registriert den zugrunde liegenden Medienkanal zum Beginn der Sitzung, wenn die verbundene Web Receiver-Anwendung den Medien-Namespace unterstützt.

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

In Version 2 würden alle Medienanfragen, die am RemoteMediaPlayer gesendet werden, über einen PendingResult-Callback einen RemoteMediaPlayer.MediaChannelResult-Wert zurückgeben.

Im CAF geben alle Medienanfragen, die am RemoteMediaClient gesendet werden, einen RemoteMediaClient.MediaChannelResult über einen PendingResult-Callback zurück, mit dem der Fortschritt und das Endergebnis der Anfrage verfolgt werden kann.

RemoteMediaPlayer von Version 2 sendet über den RemoteMediaPlayer.OnStatusUpdatedListener Benachrichtigungen über Änderungen am Mediaplayerstatus auf dem Web Receiver.

In CAF stellt RemoteMediaClient entsprechende Callbacks über seine RemoteMediaClient.Listener-Schnittstelle bereit. Es kann eine beliebige Anzahl von Listenern mit dem RemoteMediaClient registriert werden. Dadurch können sich mehrere Senderkomponenten die Instanz von RemoteMediaClient teilen, die der Sitzung zugeordnet ist.

In v2 musste die Senderanwendung dafür sorgen, dass die Benutzeroberfläche mit dem Status des Mediaplayers auf dem Webempfänger synchron bleibt.

In CAF übernimmt die Klasse UIMediaController den Großteil dieser Verantwortung.

Einleitende Overlay-Anzeige

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

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

Mini-Controller

In v2 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.

Benachrichtigung und Sperrbildschirm

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

In CAF bietet das SDK ein NotificationsOptions.Builder, mit dem Sie Mediensteuerelemente für die Benachrichtigungs- und den Sperrbildschirm in der Sender-App erstellen können. Die Benachrichtigungs- und Sperrbildschirm-Steuerelemente können beim Initialisieren von CastContext mit CastOptions 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 v2 müssen Sie einen erweiterten Controller von Grund auf in der Sender-App implementieren.

CAF bietet eine UIMediaController-Hilfsklasse, mit der Sie auf einfache Weise Ihren eigenen erweiterten Controller erstellen können.

CAF fügt ein vordefiniertes erweitertes Controller-Widget ExpandedControllerActivity hinzu, das Sie einfach Ihrer App hinzufügen können. Es ist nicht mehr erforderlich, einen benutzerdefinierten erweiterten Controller mit UIMediaController zu implementieren.

Audiofokus

In v2 musst du MediaSessionCompat verwenden, um den Audiofokus zu verwalten.

In CAF wird der Audiofokus automatisch verwaltet.

Fehlerprotokollierung

In CAF gibt es keine Logging-Optionen.

Beispielapps

Wir bieten Codelab-Anleitungen und Beispielanwendungen, die CAF verwenden.