Mit der folgenden Anleitung können Sie Ihre Android-Absender-App vom Cast SDK v2 auf CAF Sender umstellen, das auf dem Singleton CastContext 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 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 (
com.google.android.gms.cast.framework.*
) verantwortlich sind. - 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 Untertitelung in CAF Sender ähnelt der in Version 2.
Abhängigkeiten
V2 und CAF haben dieselben Abhängigkeiten von den Support-Bibliotheken und Google Play-Diensten (9.2.0 oder höher) wie im Leitfaden zu Support-Bibliotheksfunktionen beschrieben.
Die Mindestversion des Android SDK, die von CAF unterstützt wird, ist 9 (Gingerbread).
Initialisierung
Im CAF ist ein expliziter Initialisierungsschritt für das Cast-Framework erforderlich. Dazu muss das CastContext
-Singleton initialisiert werden. Verwenden Sie dazu ein geeignetes 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;
}
}
Deklarieren Sie OptionsProvider
im Tag „application“ der 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
in der Methode onCreate
jeder Aktivität verzögert:
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
Im CAF wird der Erkennungsprozess automatisch vom Framework gestartet und beendet, 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 von MediaRouteButton
implementiert und kann Ihrer Aktivität (entweder mit ActionBar
oder Toolbar
) als Menüpunkt 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 onCreateOptionMenu()
-Methode jeder Aktivität mit 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 automatisch das Cast-Dialogfeld angezeigt.
Gerätesteuerung
Im CAF wird die Gerätesteuerung größtenteils vom Framework übernommen. Die Senderanwendung muss die Verbindung zum Gerät und das Starten der Web Receiver-Anwendung mit GoogleApiClient
nicht verarbeiten (und sollte es auch nicht versuchen). Die Interaktion zwischen Absender und Web Receiver wird jetzt als „Sitzung“ dargestellt. Die Klasse
SessionManager
verarbeitet den Sitzungslebenszyklus und startet und beendet Sitzungen automatisch als Reaktion auf Nutzeraktionen: Eine Sitzung wird gestartet, wenn der Nutzer im Cast-Dialogfeld ein Cast-Gerät auswählt, und 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 über Lebenszyklusereignisse für Sitzungen benachrichtigt werden, indem sie eine SessionManagerListener
bei SessionManager
registriert. Die SessionManagerListener
-Callbacks definieren Callback-Methoden für alle Ereignisse im 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. In v2 wurde dies mit Methoden für Cast.CastApi
erledigt.
In Version 2 wurden mit den Cast.Listener
-Callbacks Benachrichtigungen über Änderungen am Gerätestatus bereitgestellt, z. B. Lautstärke, Stummschaltungsstatus und Standby-Status.
Im CAF werden Benachrichtigungen über Änderungen des Lautstärke-/Stummschaltungsstatus weiterhin über Callback-Methoden in Cast.Listener
gesendet. Diese Listener werden mit CastSession
registriert.
Alle verbleibenden Benachrichtigungen zum Gerätestatus werden über CastStateListener
-Callbacks gesendet. Diese Listener werden bei CastSession
registriert. Denken Sie daran, Listener zu entfernen, wenn die zugehörigen Fragmente, Aktivitäten oder Apps in den Hintergrund verschoben werden.
Logik für die Wiederherstellung der Verbindung
Wie bei Version 2 versucht CAF, Netzwerkverbindungen wiederherzustellen, die aufgrund eines vorübergehenden Verlusts des WLAN-Signals oder anderer Netzwerkfehler unterbrochen wurden. Das erfolgt jetzt auf Sitzungsebene. Eine Sitzung kann in den Status „Angehalten“ wechseln, wenn die Verbindung unterbrochen wird, und wieder in den Status „Verbunden“ zurückkehren, wenn die Verbindung wiederhergestellt wird. Das Framework kümmert sich darum, die Verbindung zur Web Receiver-Anwendung und zu allen Cast-Kanälen wiederherzustellen.
Außerdem bietet CAF eine automatische Wiederaufnahme von Sitzungen, die standardmäßig aktiviert ist und über CastOptions
deaktiviert werden kann.
Wenn die Senderanwendung in den Hintergrund verschoben oder beendet wird (durch Schließen der App oder aufgrund eines Absturzes), während eine Cast-Sitzung läuft, versucht das Framework, die Sitzung fortzusetzen, wenn die Senderanwendung in den Vordergrund zurückkehrt oder neu gestartet wird. Dies wird automatisch von SessionManager
verarbeitet, das die entsprechenden Callbacks für alle registrierten SessionManagerListener
-Instanzen ausgibt.
Registrierung benutzerdefinierter Channels
In Version 2 werden benutzerdefinierte Channels (die mit Cast.MessageReceivedCallback
implementiert werden) bei Cast.CastApi
registriert. Im CAF werden benutzerdefinierte Channels stattdessen bei der CastSession
-Instanz registriert. Die Registrierung kann in der Callback-Methode SessionManagerListener.onSessionStarted
erfolgen. Bei Media-Apps ist es nicht mehr erforderlich, den Media-Steuerkanal explizit über Cast.CastApi.setMessageReceivedCallbacks
zu registrieren. Weitere Informationen finden Sie im folgenden Abschnitt.
Mediensteuerung
Die v2-Klasse RemoteMediaPlayer
ist veraltet und sollte nicht verwendet werden. Im CAF wird sie durch die neue Klasse RemoteMediaClient
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-Anwendung, mit der eine Verbindung hergestellt wird, den Media-Namespace unterstützt.
Auf die RemoteMediaClient
kann als getRemoteMediaClient
-Methode des CastSession
-Objekts zugegriffen werden.
In Version 2 wird für alle Media-Anfragen, die für RemoteMediaPlayer
ausgegeben werden, über einen PendingResult
-Callback ein RemoteMediaPlayer.MediaChannelResult
zurückgegeben.
In CAF geben alle Media-Anfragen, die für RemoteMediaClient
ausgegeben werden, über einen PendingResult
-Callback ein RemoteMediaClient.MediaChannelResult
zurück. Dieser kann verwendet werden, um den Fortschritt und das endgültige Ergebnis der Anfrage zu verfolgen.
Mit der v2-Version von RemoteMediaPlayer
wurden Benachrichtigungen über Änderungen am Status des Media-Players im Web Receiver über RemoteMediaPlayer.OnStatusUpdatedListener
gesendet.
In CAF bietet RemoteMediaClient
entsprechende Callbacks über die Schnittstelle RemoteMediaClient.Listener
. Beliebig viele Listener können mit dem RemoteMediaClient
registriert werden. So können mehrere Senderkomponenten die einzelne Instanz von RemoteMediaClient
nutzen, die der Sitzung zugeordnet ist.
In Version 2 musste die Senderanwendung die Benutzeroberfläche mit dem Status des Media Players auf dem Web Receiver synchronisieren.
Im CAF übernimmt die Klasse UIMediaController
einen Großteil dieser Verantwortung.
Einführungs-Overlay
In Version 2 gibt es keine UI für das Einführungs-Overlay.
CAF bietet eine benutzerdefinierte Ansicht IntroductoryOverlay
, um die Cast-Schaltfläche hervorzuheben, wenn sie Nutzern zum ersten Mal angezeigt wird.
Mini-Controller
In Version 2 müssen Sie einen Mini-Controller von Grund auf in der Sender-App implementieren.
Im CAF stellt das SDK eine benutzerdefinierte Ansicht bereit, MiniControllerFragment
, die Sie der App-Layoutdatei der Aktivitäten hinzufügen können, in denen Sie den Mini-Controller anzeigen möchten.
Benachrichtigungen und Sperrbildschirm
In Version 2 werden Controller für Benachrichtigungen und den Sperrbildschirm nicht vom SDK bereitgestellt. Für dieses SDK müssen Sie diese Funktionen mithilfe der Android-Framework-APIs in Ihre Sender-App einbauen.
Im CAF bietet das SDK eine NotificationsOptions.Builder
, mit der Sie Mediensteuerelemente für die Benachrichtigung und den Sperrbildschirm in die Sender-App einbauen können. Die Benachrichtigungs- und Sperrbildschirmsteuerelemente können mit der 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 einen maximierten Controller von Grund auf in der Sender-App implementieren.
Das CAF bietet die Hilfsklasse UIMediaController
, mit der Sie ganz einfach einen eigenen erweiterten Controller erstellen können.
Mit CAF wird ein vorgefertigtes Widget für den erweiterten Controller ExpandedControllerActivity
hinzugefügt, das Sie einfach in Ihre App einfü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.
Im CAF wird der Audiofokus automatisch verwaltet.
Fehlerprotokollierung
Im CAF gibt es keine Logging-Optionen.
Beispielanwendungen
Wir haben Codelab-Anleitungen und Beispiel-Apps, die CAF verwenden.