Mit dem folgenden Verfahren kannst du deine Android-Sender-App von 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 dich, was die Entwicklung einer Cast-App erheblich vereinfacht.
Einführung
- Der 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. v2 bot keine UI-Komponenten und erforderte, dass Sie diese Widgets implementieren.
- GoogleApiClient ist für die Verwendung der Cast API nicht mehr erforderlich.
- Untertitel im CAF-Sender funktionieren ähnlich wie in v2.
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 von CAF unterstützte Android SDK-Mindestversion ist 9 (Gingerbread).
Initialisierung
In CAF ist ein expliziter Initialisierungsschritt für das Cast-Framework erforderlich. Dazu wird das Singleton CastContext 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 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 die CastContext in der onCreate-Methode 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);
}
Diese Schritte waren in v2 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 v2 werden diese Komponenten von der MediaRouter-Supportbibliothek bereitgestellt.
Das Cast-Symbol wird weiterhin von MediaRouteButton implementiert und kann deiner Aktivität (entweder mit ActionBar oder Toolbar) als Menüpunkt in deinem 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"/>
Überschreibe die Methode onCreateOptionMenu() jeder Aktivität mit CastButtonFactory, 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 ein Nutzer auf die Schaltfläche tippt, wird das Cast-Dialogfeld automatisch angezeigt.
Gerätesteuerung
In CAF wird die Gerätesteuerung größtenteils vom Framework übernommen. Die Sender-Anwendung muss die Verbindung zum Gerät und das Starten der Web-Empfänger-Anwendung mit GoogleApiClient nicht verarbeiten und sollte dies auch nicht versuchen. Die Interaktion zwischen Sender und Web-Receiver wird jetzt als „Sitzung“ dargestellt. Die Klasse SessionManager verarbeitet den Lebenszyklus der Sitzung und startet und beendet Sitzungen automatisch als Reaktion auf Nutzergesten: Eine Sitzung wird gestartet, wenn der Nutzer im Cast-Dialogfeld ein Übertragungsgerä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 Sender-Anwendung kann über Lifecycle-Events der Sitzung benachrichtigt werden, indem ein SessionManagerListener bei der SessionManager registriert wird. Die SessionManagerListener-Callbacks definieren Callback-Methoden für alle Lifecycle-Events einer Sitzung.
Die Klasse CastSession stellt eine Sitzung mit einem Cast-Gerät dar. Die Klasse enthält Methoden zum Steuern der Lautstärke und des Stummschaltungsstatus des Geräts. In v2 wurde dies mit Methoden für Cast.CastApi erledigt.
In v2 wurden über die Cast.Listener-Callbacks Benachrichtigungen zu Änderungen am Gerätestatus bereitgestellt, einschließlich Lautstärke, Stummschaltung, Stand-by-Status usw.
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 sind beim CastSession registriert. Achten Sie darauf, dass Sie Listener weiterhin abmelden, wenn die zugehörigen Fragmente, Aktivitäten oder Apps in den Hintergrund verschoben werden.
Logik für die Wiederherstellung der Verbindung
Wie bei v2 versucht CAF, Netzwerkverbindungen wiederherzustellen, die aufgrund eines vorübergehenden Verlusts des WLAN-Signals oder anderer Netzwerkfehler unterbrochen wurden. Dies geschieht jetzt auf Sitzungsebene. Eine Sitzung kann in den Status „Ausgesetzt“ wechseln, wenn die Verbindung unterbrochen wird, und wechselt wieder in den Status „Verbunden“, wenn die Verbindung wiederhergestellt ist. Das Framework übernimmt die Wiederherstellung der Verbindung zur Webempfänger-Anwendung und die Wiederherstellung aller Cast-Kanäle im Rahmen dieses Prozesses.
Außerdem wird durch das CAF die automatische Fortsetzung von Sitzungen hinzugefügt, die standardmäßig aktiviert ist und über CastOptions deaktiviert werden kann.
Wenn die Sender-App während einer laufenden Cast-Sitzung in den Hintergrund verschoben oder beendet wird (durch Wegwischen oder aufgrund eines Absturzes), versucht das Framework, die Sitzung fortzusetzen, wenn die Sender-App wieder in den Vordergrund verschoben oder neu gestartet wird. Dies wird automatisch von SessionManager übernommen, das die entsprechenden Callbacks für alle registrierten SessionManagerListener-Instanzen ausgibt.
Registrierung benutzerdefinierter Channels
In v2 werden benutzerdefinierte Kanäle (implementiert mit Cast.MessageReceivedCallback) beim Cast.CastApi registriert. Im 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. Im 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 instanziiert das Objekt automatisch und registriert den zugrunde liegenden Medienkanal zu Beginn der Sitzung, wenn die Web Receiver-Anwendung, mit der eine Verbindung hergestellt wird, den Medien-Namespace unterstützt.
Auf die RemoteMediaClient kann über die Methode getRemoteMediaClient des CastSession-Objekts zugegriffen werden.
In v2 gaben alle Medienanfragen, die für RemoteMediaPlayer ausgegeben wurden, über einen PendingResult-Callback ein RemoteMediaPlayer.MediaChannelResult zurück.
Im CAF geben alle Medienanfragen, die für RemoteMediaClient ausgegeben werden, über einen PendingResult-Callback ein RemoteMediaClient.MediaChannelResult zurück. Damit können der Fortschritt und das endgültige Ergebnis der Anfrage verfolgt werden.
Die v2-RemoteMediaPlayer sendet Benachrichtigungen über Änderungen am Status des Mediaplayers auf dem Web Receiver über die RemoteMediaPlayer.OnStatusUpdatedListener.
Im CAF stellt die RemoteMediaClient entsprechende Callbacks über die Schnittstelle RemoteMediaClient.Listener bereit. Es können beliebig viele Listener bei RemoteMediaClient registriert werden. Dadurch können mehrere Senderkomponenten die einzelne Instanz von RemoteMediaClient, die mit der Sitzung verknüpft ist, gemeinsam nutzen.
In v2 musste die Sender-Anwendung die Benutzeroberfläche mit dem Status des Mediaplayers auf dem Webempfänger synchronisieren.
Im CAF übernimmt die Klasse UIMediaController den Großteil dieser Aufgabe.
Einführungs-Overlay
V2 bietet keine Einführungsoberfläche.
Das CAF bietet eine benutzerdefinierte Ansicht (IntroductoryOverlay), um das Cast-Symbol hervorzuheben, wenn es Nutzern zum ersten Mal angezeigt wird.
Mini-Controller
In v2 musst du einen Mini-Controller von Grund auf in der Sender-App implementieren.
In CAF stellt das SDK eine benutzerdefinierte Ansicht (MiniControllerFragment) bereit, die du der App-Layoutdatei der Aktivitäten hinzufügen kannst, in denen du den Mini-Controller anzeigen möchtest.
Benachrichtigungen und Sperrbildschirm
In v2 werden Controller für Benachrichtigungen und den Sperrbildschirm nicht vom SDK bereitgestellt. Für dieses SDK musst du diese Funktionen mithilfe der Android-Framework-APIs in deine Sender-App einbinden.
Im CAF stellt das SDK einen NotificationsOptions.Builder bereit, mit dem du Mediensteuerelemente für die Benachrichtigung und den Sperrbildschirm in die Sender-App einbinden kannst. Die Steuerelemente für die Benachrichtigung und den Sperrbildschirm können mit dem CastOptions aktiviert werden, wenn die CastContext initialisiert wird.
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 v2 musst du einen erweiterten Controller in der Sender-App von Grund auf neu implementieren.
Das CAF bietet eine Hilfsklasse UIMediaController, mit der du ganz einfach deinen eigenen erweiterten Controller erstellen kannst.
Das CAF fügt ein vordefiniertes Widget für den erweiterten Controller hinzu (ExpandedControllerActivity), das Sie einfach Ihrer App hinzufügen können. Sie müssen keinen benutzerdefinierten erweiterten Controller mehr mit UIMediaController implementieren.
Audiofokus
In v2 musst du MediaSessionCompat verwenden, um den Audiofokus zu verwalten.
Im CAF wird der Audiofokus automatisch verwaltet.
Debugging-Logs
Im CAF gibt es keine Logging-Optionen.
Beispielanwendungen
Wir bieten Codelab-Anleitungen und Beispiel-Apps, die das CAF verwenden.