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

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

Das Cast CAF Sender SDK verwendet CastContext, um 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 vertrieben.
  • Es wurden neue Pakete hinzugefügt, die für die Einhaltung der Checkliste für das Google Cast-Design verantwortlich sind (com.google.android.gms.cast.framework.*).
  • 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 Untertitel in CAF Sender ähneln denen in Version 2.

Abhängigkeiten

Version 2 und CAF haben dieselben Abhängigkeiten von den Support Librarys und Google Play-Diensten (Version 9.2.0 oder höher), wie im Leitfaden zu den Funktionen der Support Library beschrieben.

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

Initialisierung

In CAF ist ein expliziter Initialisierungsschritt für das Cast-Framework erforderlich. Dabei wird das CastContext-Singleton initialisiert und mit einem geeigneten OptionsProvider die Web Receiver-Anwendungs-ID und alle anderen globalen Optionen angegeben.

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 den OptionsProvider im „application“-Tag der AndroidManifest.xml-Datei der App:

<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 automatisch vom Framework gestartet und beendet, wenn die App in den Vordergrund bzw. 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-Support Bibliothek bereitgestellt.

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

<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 mit CastButtonFactory, um MediaRouteButton mit dem Cast-Framework zu verknüpfen:

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 ein Nutzer auf die Schaltfläche tippt, wird automatisch das Cast-Dialogfeld angezeigt.

Gerätesteuerung

In CAF wird die Gerätesteuerung weitgehend vom Framework übernommen. Die Sender-App muss die Verbindung zum Gerät und den Start der Web Receiver-App nicht mit GoogleApiClient verarbeiten (und sollte es auch nicht versuchen). Die Interaktion zwischen Sender und Web Receiver wird jetzt als „Sitzung“ dargestellt. Die SessionManager Klasse verwaltet den Sitzungslebenszyklus und startet und beendet Sitzungen automatisch als Reaktion auf Nutzergesten: Eine Sitzung wird gestartet, wenn der Nutzer im Cast Dialogfeld ein Cast-Gerät auswählt, und beendet, wenn er im Cast-Dialogfeld auf die Schaltfläche „Übertragung beenden“ tippt oder wenn die Sender-App selbst beendet wird. Die Sender App kann über Ereignisse im Sitzungslebenszyklus benachrichtigt werden, indem sie einen SessionManagerListener bei SessionManager registriert. Die SessionManagerListener-Callbacks definieren Callback-Methoden für alle Ereignisse im Sitzungslebenszyklus.

Die Klasse CastSession stellt eine Sitzung mit einem Übertragungsgerät dar. Die Klasse enthält Methoden zum Steuern der Gerätelautstärke und des Stummschaltungsstatus. In Version 2 wurden diese Methoden in Cast.CastApi verwendet.

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

In CAF werden Benachrichtigungen über Änderungen am Lautstärke-/Stummschaltungsstatus weiterhin über Callback Methoden in der Cast.Listener gesendet. Diese Listener werden bei CastSession registriert. Alle übrigen Benachrichtigungen zum Gerätestatus werden über CastStateListener Callbacks gesendet. Diese Listener werden bei CastSession registriert. Sie müssen die Registrierung der Listener weiterhin aufheben, wenn die zugehörigen Fragmente, Aktivitäten oder Apps in den Hintergrund wechseln.

Logik für die Wiederherstellung der Verbindung

Wie in Version 2 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 „Angehalten“ wechseln, wenn die Verbindung unterbrochen wird, und wieder in den Status „Verbunden“ wechseln, wenn die Konnektivität wiederhergestellt wird. Das Framework stellt die Verbindung zur Web Receiver-App und zu allen Cast-Channels wieder her.

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

Benutzerdefinierte Channelregistrierung

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

Mediensteuerung

Die Version 2-Klasse RemoteMediaPlayer ist veraltet und sollte nicht verwendet werden. In CAF wird sie durch die neue RemoteMediaClient Klasse 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-App, mit der eine Verbindung hergestellt wird, den Media-Namespace unterstützt.

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

In Version 2 wurde für alle Media-Anfragen, die an RemoteMediaPlayer gesendet wurden, über einen PendingResult Callback ein RemoteMediaPlayer.MediaChannelResult zurückgegeben.

In CAF wird für alle Media-Anfragen, die an die RemoteMediaClient gesendet werden, über einen RemoteMediaClient.MediaChannelResult Callback ein PendingResult zurückgegeben, mit dem der Fortschritt und das Endergebnis der Anfrage verfolgt werden können.

In Version 2 wurden über RemoteMediaPlayer.OnStatusUpdatedListener Benachrichtigungen über Änderungen am Status des Media Players auf dem Web Receiver gesendet.RemoteMediaPlayer

In CAF bietet RemoteMediaClient entsprechende Callbacks über die RemoteMediaClient.Listener Schnittstelle. Es können beliebig viele Listener bei RemoteMediaClient registriert werden, sodass mehrere Sender-Komponenten die einzelne Instanz von RemoteMediaClient gemeinsam nutzen können, die mit der Sitzung verknüpft ist.

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

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

Einführungs-Overlay

Version 2 bietet keine UI für ein Einführungs-Overlay.

CAF provides a custom view IntroductoryOverlay to highlight the Cast button when it is first shown to users.

Mini-Controller

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

In CAF bietet das SDK eine 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 keine Controller für Benachrichtigungen und Sperrbildschirme vom SDK bereitgestellt. Für dieses SDK müssen Sie diese Funktionen mit den Android-Framework-APIs in Ihre Sender-App einbauen.

In CAF bietet das SDK einen NotificationsOptions.Builder mit dem Sie Media-Steuerelemente für Benachrichtigungen und Sperrbildschirme in die Sender-App einbauen können. Die Steuerelemente für Benachrichtigungen und Sperrbildschirme können mit den 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 in der Sender-App einen erweiterten Controller von Grund auf implementieren.

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

CAF fügt ein vorgefertigtes Widget für einen erweiterten Controller ExpandedControllerActivity hinzu, das Sie einfach Ihrer App hinzufügen können. Sie müssen keinen benutzerdefinierten erweiterten Controller mehr mit UIMediaControllerimplementieren.

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

Beispielanwendungen

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