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.