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

Mit dem folgenden Verfahren können Sie die Android-Absender-App vom Cast SDK v2 in den CAF-Sender umwandeln. Dieser basiert auf dem CastContext-Singleton.

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

Einführung

  • Der CAF-Absender 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 verantwortlich sind (com.google.android.gms.cast.framework.*)
  • Der CAF-Absender stellt Widgets bereit, die den UX-Anforderungen für Cast entsprechen. Version 2 hat keine UI-Komponenten bereitgestellt und erforderte die Implementierung dieser Widgets.
  • Für die Verwendung der Cast API ist GoogleApiClient nicht mehr erforderlich.
  • Untertitel in CAF Sender ähneln Version 2.

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 den Funktionen der Supportbibliothek beschrieben.

Die mindestens von CAF unterstützte Android SDK-Version ist 9 (Gingerbread).

Initialisierung

In CAF ist für das Cast-Framework ein expliziter Initialisierungsschritt erforderlich. Dazu wird der Singleton CastContext mit einem entsprechenden OptionsProvider initialisiert, 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 „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>

Initialisieren Sie CastContext auf sichere Weise in der Methode onCreate 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 automatisch durch das Framework gestartet und beendet, wenn die Anwendung in den Vordergrund verschoben bzw. in den Hintergrund verschoben wird. MediaRouteSelector und MediaRouter.Callback sollten nicht verwendet werden.

Streaming-Schaltfläche und Streaming-Dialogfeld

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

Das Cast-Symbol wird immer noch durch den MediaRouteButton implementiert und kann Ihrer Aktivität (über einen ActionBar oder einen Toolbar) als Menüelement 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 Methode onCreateOptionMenu() jeder Aktivität. Verwenden Sie dazu 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 das Streaming-Dialogfeld automatisch eingeblendet.

Gerätesteuerung

In CAF wird die Gerätesteuerung hauptsächlich vom Framework übernommen. Die Absenderanwendung muss keine Verbindung zum Gerät herstellen (und sollte dies auch nicht versuchen). Die Anwendung des Webempfängers wird über GoogleApiClient gestartet. Die Interaktion zwischen dem Absender und dem Webempfänger wird jetzt als „Sitzung“ dargestellt. Die Klasse SessionManager übernimmt den Sitzungslebenszyklus und startet und beendet Sitzungen automatisch als Reaktion auf Nutzerbewegungen: Eine Sitzung wird gestartet, wenn der Nutzer ein Cast-Gerät im Streaming-Dialogfeld auswählt und beendet wird, wenn der Nutzer auf die Schaltfläche „Streaming beenden“ im Streaming-Dialogfeld tippt oder wenn die Absender-App selbst beendet wird. Die Senderanwendung kann über Lebenszyklusereignisse der Sitzung benachrichtigt werden, indem eine SessionManagerListener mit SessionManager registriert wird. Mit den SessionManagerListener-Callbacks werden Callback-Methoden für alle Lebenszyklusereignisse der Sitzung definiert.

Die Klasse CastSession stellt eine Sitzung mit einem Übertragungsgerät dar. Die Klasse hat Methoden zum Steuern der Gerätelautstärke und zum Stummschalten von Zuständen, die zuvor in V2 mit Methoden in Cast.CastApi möglich waren.

In v2 haben die Callbacks für Cast.Listener Benachrichtigungen über Änderungen am Gerätestatus bereitgestellt, einschließlich Lautstärke, Stummschaltung, Stand-by-Status usw.

In CAF werden Benachrichtigungen zu Statusänderungen und Stummschaltungen weiterhin über Callback-Methoden im Cast.Listener gesendet. Diese Listener sind unter CastSession registriert. Alle verbleibenden Gerätestatusbenachrichtigungen werden über CastStateListener-Callbacks gesendet. Diese Listener sind im CastSession registriert. Heben Sie die Registrierung von Listenern auch dann auf, wenn die zugehörigen Fragmente, Aktivitäten oder Apps in den Hintergrund verschoben werden.

Verbindungslogik

Wie bei V2 wird CAF versuchen, Netzwerkverbindungen wiederherzustellen, die aufgrund vorübergehender Verluste des WLAN-Signals oder anderer Netzwerkfehler verloren gehen. Dies erfolgt jetzt auf Sitzungsebene. Eine Sitzung kann bei Unterbrechung der Verbindung in den Status „Gesperrt“ übergehen und nach dem Wiederherstellen der Verbindung in den Status „Verbunden“ übergehen. Das Framework sorgt dafür, dass die Verbindung zur Web Receiver App und zu allen Cast-Kanälen wiederhergestellt wird.

Darüber hinaus fügt CAF die automatische Sitzungswiederaufnahme hinzu, die standardmäßig aktiviert ist und über CastOptions deaktiviert werden kann. Wenn die Absenderanwendung im Hintergrund gesendet oder durch Löschen oder aufgrund eines Absturzes beendet wird, versucht das Framework, diese Sitzung fortzusetzen, wenn die Absenderanwendung in den Vordergrund zurückkehrt oder neu gestartet wird. Dies wird automatisch von der SessionManager verarbeitet, die die entsprechenden Callbacks für alle registrierten SessionManagerListener-Instanzen ausgibt.

Benutzerdefinierte Kanalregistrierung

In v2 werden benutzerdefinierte Kanäle (mit Cast.MessageReceivedCallback implementiert) bei Cast.CastApi registriert. In CAF werden benutzerdefinierte Channels stattdessen bei der Instanz CastSession registriert. Die Registrierung kann in der SessionManagerListener.onSessionStarted-Callback-Methode erfolgen. Bei Medienanwendungen ist es nicht mehr erforderlich, den Medienkontrollkanal über Cast.CastApi.setMessageReceivedCallbacks explizit zu registrieren. Weitere Informationen finden Sie im folgenden Abschnitt.

Mediensteuerung

Die V2-Klasse RemoteMediaPlayer wurde verworfen und sollte nicht mehr verwendet werden. In CAF wird sie durch die neue Klasse RemoteMediaClient ersetzt, die eine entsprechende Funktionalität in einer praktischeren API bietet. Sie müssen dieses Objekt nicht explizit initialisieren oder registrieren. Das Framework instanziiert das Objekt automatisch und registriert den zugrunde liegenden Medienkanal zum Zeitpunkt der Sitzung, wenn die Web Receiver-Anwendung verbunden ist, um den Medien-Namespace zu unterstützen.

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

In Version 2 wird bei allen Medienanfragen, die für RemoteMediaPlayer gesendet werden, über einen PendingResult-Callback ein RemoteMediaPlayer.MediaChannelResult zurückgegeben.

In CAF wird für alle Medienanfragen, die im RemoteMediaClient ausgegeben werden, ein RemoteMediaClient.MediaChannelResult über einen PendingResult-Callback zurückgegeben, mit dem der Fortschritt und das endgültige Ergebnis der Anfrage erfasst werden kann.

Die V2-RemoteMediaPlayer sendet Benachrichtigungen über Änderungen am Mediaplayer-Status auf dem Webempfänger über die RemoteMediaPlayer.OnStatusUpdatedListener.

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

In Version 2 musste die Absenderanwendung die Belastung der Benutzeroberfläche vornehmen, die mit dem Status des Mediaplayers auf dem Webempfänger synchron war.

In CAF übernimmt der Kurs UIMediaController die meiste Verantwortung.

Einführendes Overlay

V2 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 Version 2 müssen Sie einen Mini-Controller von Grund auf in der Absender-App implementieren.

In CAF enthält 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.

Benachrichtigungs- und Sperrbildschirm

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

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

Controller maximiert

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

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

CAF fügt das vordefinierte erweiterte Controller-Widget ExpandedControllerActivity hinzu. Sie können es einfach Ihrer App hinzufügen. Sie müssen keinen benutzerdefinierten erweiterten Controller 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.

Beispielapps

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