Mit der folgenden Anleitung 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 Google Cast Design-Checkliste 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 Untertitelung in CAF Sender ähnelt der 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 Singleton CastContext initialisiert und ein geeigneter OptionsProvider verwendet, 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 den OptionsProvider im Tag „application“ der Datei AndroidManifest.xml 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 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 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 der Nutzer 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 bereitgestellt, z. B.
Lautstärke, Stummschaltungsstatus und Standby-Status.
In CAF werden Benachrichtigungen über Änderungen des Lautstärke-/Stummschaltungsstatus weiterhin über Callback
Methoden in der Cast.Listener bereitgestellt. Diese Listener werden bei
CastSession registriert.
Alle übrigen Benachrichtigungen zum Gerätestatus werden über
CastStateListener
-Callbacks bereitgestellt. Diese Listener werden bei CastSession registriert. Achten Sie darauf, dass Sie die Registrierung von Listenern 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 Verbindung 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. Bei 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 Klasse aus Version 2
RemoteMediaPlayer
ist veraltet und sollte nicht verwendet werden. In CAF wird sie durch die neue
RemoteMediaClient
Klasse ersetzt, die eine entsprechende Funktionalität 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 Methode
getRemoteMediaClient des Objekts CastSession zugegriffen werden.
In Version 2 wurde für alle Media-Anfragen, die an RemoteMediaPlayer gesendet wurden, ein
RemoteMediaPlayer.MediaChannelResult über einen PendingResult-Callback zurückgegeben.
In CAF wird für alle Media-Anfragen, die an die RemoteMediaClient gesendet werden, ein
RemoteMediaClient.MediaChannelResult
über einen
PendingResult
Callback 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. Bei RemoteMediaClient können beliebig viele Listener registriert werden. So können mehrere Sender-Komponenten die einzelne Instanz von RemoteMediaClient gemeinsam nutzen, die mit der Sitzung verknüpft ist.
In Version 2 musste die Sender-App dafür sorgen, dass die Benutzeroberfläche mit dem Status des Media Players auf dem Web Receiver synchronisiert wurde.
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 einen Mini-Controller von Grund auf in der Sender-App 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 den Sperrbildschirm 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 den Sperrbildschirm
in die Sender-App einbauen können. Die Steuerelemente für Benachrichtigungen und den Sperrbildschirm können mit
den
CastOptions
aktiviert werden, wenn Sie CastContext initialisieren.
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 erweiterten Controller von Grund auf in der Sender-App implementieren.
CAF bietet die
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.