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

Mit der folgenden Anleitung kannst du deine Android-Sender-App vom Cast SDK v2 in CAF Sender konvertieren, das auf dem CastContext-Singleton 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 über den Android SDK Manager als Teil der Google Play-Dienste bereitgestellt.
  • Es wurden neue Pakete hinzugefügt, die die Einhaltung der Checkliste für das Google Cast-Design (com.google.android.gms.cast.framework.*) übernehmen.
  • CAF Sender bietet Widgets, die den UX-Anforderungen von Cast entsprechen. Version 2 bot keine UI-Komponenten und erforderte die Implementierung dieser Widgets.
  • Die Verwendung von GoogleApiClient ist für die Verwendung der Cast API nicht mehr erforderlich.
  • Untertitel in CAF-Sendern ähneln denen in Version 2.

Abhängigkeiten

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

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

Initialisierung

In CAF ist ein expliziter Initialisierungsschritt für das Cast-Framework erforderlich. Dazu muss das CastContext-Singleton initialisiert werden. Dazu wird ein geeigneter OptionsProvider verwendet, um die Web-Empfänger-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 die OptionsProvider im „application“-Tag 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>

CastContext in der onCreate-Methode jeder Aktivität verzögert initialisieren:

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

In CAF wird der Erkennungsprozess automatisch vom Framework gestartet und angehalten, 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.

Die Schaltfläche „Streamen“ wird weiterhin über das MediaRouteButton implementiert und kann deiner Aktivität als Menüpunkt (mithilfe eines 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 onCreateOptionMenu()-Methode jeder Aktivität, indem Sie CastButtonFactory verwenden, um die 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 Übertragungsdialogfeld angezeigt.

Gerätesteuerung

In CAF wird die Gerätesteuerung weitgehend vom Framework übernommen. Die Senderanwendung muss nicht (und sollte nicht versuchen) die Verbindung zum Gerät herstellen und die Web-Empfängeranwendung mit GoogleApiClient starten. Die Interaktion zwischen Absender und Webempfänger wird jetzt als „Sitzung“ dargestellt. Die Klasse SessionManager verwaltet den Sitzungszyklus und startet und beendet Sitzungen automatisch als Reaktion auf Nutzergesten: Eine Sitzung wird gestartet, wenn der Nutzer im Streaming-Dialogfeld ein Streaminggerät auswählt, und beendet, wenn der Nutzer im Streaming-Dialogfeld auf die Schaltfläche „Streaming beenden“ tippt oder die Sender-App selbst beendet wird. Die Senderanwendung kann über Sitzungslebenszyklusereignisse benachrichtigt werden, indem eine SessionManagerListener beim SessionManager registriert wird. Die SessionManagerListener-Callbacks definieren Callback-Methoden für alle Ereignisse des 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, was in Version 2 zuvor mithilfe von Methoden auf Cast.CastApi erfolgte.

In Version 2 wurden über die Callbacks von Cast.Listener Benachrichtigungen zu Änderungen des Gerätestatus gesendet, z. B. zu Lautstärke, Stummschaltungsstatus und Standbystatus.

In CAF werden Benachrichtigungen zu Änderungen des Lautstärke-/Stummschaltungsstatus weiterhin über Rückrufmethoden in der Cast.Listener gesendet. Diese Listener sind bei CastSession registriert. Alle verbleibenden Benachrichtigungen zum Gerätestatus werden über CastStateListener-Callbacks gesendet. Diese Listener sind beim CastSession registriert. Listener müssen auch dann abgemeldet werden, wenn die zugehörigen Fragmente, Aktivitäten oder Apps in den Hintergrund wechseln.

Logik für die Wiederherstellung der Verbindung

Wie bei Version 2 versucht CAF, Netzwerkverbindungen wiederherzustellen, die aufgrund eines vorübergehenden WLAN-Signalausfalls oder anderer Netzwerkfehler unterbrochen wurden. Dies geschieht jetzt auf Sitzungsebene. Eine Sitzung kann in den Status „Ausgesetzt“ wechseln, wenn die Verbindung unterbrochen wird, und wieder in den Status „Verbunden“, wenn die Verbindung wiederhergestellt wird. Das Framework stellt dabei die Verbindung zur Web-Empfängeranwendung und zu allen Cast-Kanälen wieder her.

Außerdem bietet CAF die automatische Sitzungsfortsetzung, die standardmäßig aktiviert ist und über CastOptions deaktiviert werden kann. Wenn die Senderanwendung während einer laufenden Übertragungssitzung in den Hintergrund verschoben oder beendet wird (durch Wischen oder einen Absturz), versucht das Framework, diese Sitzung fortzusetzen, wenn die Senderanwendung wieder in den Vordergrund wechselt oder neu gestartet wird. Dieser Vorgang wird automatisch vom SessionManager verwaltet, der die entsprechenden Rückrufe an alle registrierten SessionManagerListener-Instanzen sendet.

Benutzerdefinierte Channelregistrierung

In Version 2 werden benutzerdefinierte Channels (implementiert mit Cast.MessageReceivedCallback) beim Cast.CastApi registriert. In CAF werden benutzerdefinierte Kanäle stattdessen bei der CastSession-Instanz registriert. Die Registrierung kann in der Callback-Methode SessionManagerListener.onSessionStarted erfolgen. Bei 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 dieselben Funktionen in einer praktischeren API bietet. Es ist nicht erforderlich, dieses Objekt explizit zu initialisieren oder zu registrieren. Das Framework erstellt das Objekt automatisch und registriert den zugrunde liegenden Medienkanal zu Beginn der Sitzung, wenn die Web-Empfä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 wird bei allen über den RemoteMediaPlayer gesendeten Medienanfragen über einen PendingResult-Callback ein RemoteMediaPlayer.MediaChannelResult zurückgegeben.

In CAF geben alle über die RemoteMediaClient gesendeten Medienanfragen über einen PendingResult-Callback eine RemoteMediaClient.MediaChannelResult zurück, mit der der Fortschritt und das Ergebnis der Anfrage verfolgt werden können.

Die RemoteMediaPlayer der Version 2 sendet Benachrichtigungen über Änderungen am Status des Mediaplayers an den Webreceiver über die RemoteMediaPlayer.OnStatusUpdatedListener.

In CAF bietet die RemoteMediaClient über die RemoteMediaClient.Listener-Schnittstelle entsprechende Rückrufe. Bei der RemoteMediaClient kann eine beliebige Anzahl von Listenern registriert werden. So können mehrere Senderkomponenten die einzelne Instanz der RemoteMediaClient gemeinsam nutzen, die der Sitzung zugeordnet ist.

In Version 2 musste die Senderanwendung dafür sorgen, dass die Benutzeroberfläche mit dem Status des Mediaplayers auf dem Webempfänger synchronisiert blieb.

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

Einführungs-Overlay

V2 bietet keine Einführungs-Overlay-Benutzeroberfläche.

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

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 du der App-Layoutdatei der Aktivitäten hinzufügen kannst, in denen der Mini-Controller angezeigt werden soll.

Benachrichtigungen und Sperrbildschirm

In Version 2 werden keine Steuerelemente für Benachrichtigungen und Sperrbildschirme 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 die Funktion NotificationsOptions.Builder, mit der du Mediensteuerelemente für die Benachrichtigung und den Sperrbildschirm in die Sender-App einbinden kannst. Die Steuerelemente für Benachrichtigungen und Sperrbildschirm können mit CastOptions aktiviert werden, wenn du die CastContext initialisierst.

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 in der Sender-App einen maximierten Controller von Grund auf implementieren.

CAF bietet eine Hilfsklasse UIMediaController, mit der Sie ganz einfach 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. 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.

Bei CAF wird der Audiofokus automatisch verwaltet.

Fehlerprotokollierung

In CAF gibt es keine Logging-Optionen.

Beispielanwendungen

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