Mit dem folgenden Verfahren können Sie Ihre Android-Sender-App von Cast SDK v2 in CAF-Sender konvertieren. Dies basiert auf dem CastContext-Singleton.
Das Cast CAF Sender SDK verwendet CastContext zur Verwaltung des GoogleAPIClient in deinem Namen. CastContext verwaltet Lebenszyklen, Fehler und Callbacks für dich, was die Entwicklung einer Cast-App erheblich vereinfacht.
Einleitung
- Der CAF-Sender wird weiterhin als Teil der Google Play-Dienste über den Android SDK Manager bereitgestellt.
- Es wurden neue Pakete hinzugefügt, die die Einhaltung der Google Cast Design-Checkliste (
com.google.android.gms.cast.framework.*
) übernehmen. - CAF Sender stellt Widgets bereit, die den Cast UX-Anforderungen entsprechen. In Version 2 gab es keine UI-Komponenten und Sie mussten diese Widgets implementieren.
- Für die Nutzung der Cast API ist die Verwendung von GoogleApiClient nicht mehr erforderlich.
- Die Untertitelung in CAF Sender ähnelt 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 Supportbibliotheken beschrieben.
CAF muss mindestens die Android SDK-Version 9 (Gingerbread) unterstützen.
Initialisierung
In CAF ist ein expliziter Initialisierungsschritt für das Cast-Framework erforderlich. Dazu gehört die Initialisierung des CastContext
-Singleton mit einem geeigneten 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;
}
}
Deklariere OptionsProvider
im Tag „application“ 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
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 vom Framework automatisch gestartet und beendet, wenn die App in den Vordergrund wechselt bzw. in den Hintergrund wechselt. MediaRouteSelector
und MediaRouter.Callback
sollten nicht verwendet werden.
Cast-Symbol und Streaming-Dialogfeld
Wie in Version 2 werden diese Komponenten von der MediaRouter-Supportbibliothek bereitgestellt.
Das Cast-Symbol wird weiterhin durch die MediaRouteButton
implementiert und kann deiner Aktivität (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 onCreateOptionMenu()
-Methode jeder Aktivität, indem du mithilfe von CastButtonFactory
die MediaRouteButton
mit dem Cast-Framework verbindest:
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
In CAF wird die Gerätesteuerung weitgehend vom Framework übernommen. Die Absenderanwendung muss die Verbindung zum Gerät und das Starten der Web Receiver-Anwendung mit GoogleApiClient
nicht selbst verarbeiten (und sollte dies auch nicht versuchen). Die Interaktion zwischen Sender und Webempfänger wird jetzt als "Sitzung" dargestellt. Die Klasse SessionManager
steuert den Sitzungslebenszyklus und startet und beendet Sitzungen als Reaktion auf Nutzergesten: Eine Sitzung wird gestartet, wenn der Nutzer im Streaming-Dialogfeld ein Übertragungsgerät auswählt. Sie wird beendet, wenn der Nutzer im Dialogfeld „Streamen“ auf die Schaltfläche „Streamen beenden“ tippt oder die Sender-App selbst beendet wird. Die Absenderanwendung kann über Sitzungslebenszyklus-Ereignisse informiert werden, indem eine SessionManagerListener
mit der SessionManager
registriert wird. Die SessionManagerListener
-Callbacks definieren Callback-Methoden für alle Sitzungslebenszyklusereignisse.
Die Klasse CastSession
steht für eine Sitzung mit einem Übertragungsgerät. Die Klasse bietet Methoden zum Steuern der Gerätelautstärke und zum Stummschalten, wie es bisher in Version 2 mit Methoden in Cast.CastApi
möglich war.
In Version 2 wurden über die Cast.Listener
-Callbacks Benachrichtigungen über Änderungen des Gerätestatus gesendet, einschließlich Lautstärke, Stummschaltung, Stand-by-Status usw.
In CAF werden Benachrichtigungen über Statusänderungen von Lautstärke/Stummschaltung weiterhin über Callback-Methoden im Cast.Listener
gesendet. Diese Listener werden mit CastSession
registriert.
Alle verbleibenden Gerätestatusbenachrichtigungen werden über CastStateListener
-Callbacks gesendet. Diese Listener werden im CastSession
registriert. Achten Sie darauf, die Registrierung von Listenern dennoch aufzuheben, wenn die zugehörigen Fragmente, Aktivitäten oder Anwendungen in den Hintergrund gehen.
Logik für die erneute Verbindung
Wie bei v2 versucht CAF, Netzwerkverbindungen wiederherzustellen, die aufgrund eines vorübergehenden WLAN-Signals oder anderer Netzwerkfehler verloren gegangen sind. Dies erfolgt jetzt auf Sitzungsebene. Eine Sitzung kann in den Status "Unterbrochen" wechseln, wenn die Verbindung unterbrochen wird, und in den Status "Verbunden" übergehen, sobald die Verbindung wiederhergestellt ist. Das Framework sorgt dafür, dass die Verbindung zur Web Receiver-Anwendung und alle Cast-Kanäle im Rahmen dieses Prozesses wiederhergestellt wird.
Darüber hinaus fügt CAF auch die automatische Sitzungswiederaufnahme hinzu, die standardmäßig aktiviert ist und über CastOptions
deaktiviert werden kann.
Wenn die Absender-App während eines laufenden Streams in den Hintergrund gesendet oder (durch Wegwischen oder einen Absturz) beendet wird, versucht das Framework, diese Sitzung fortzusetzen, wenn die Absender-App zum Vordergrund zurückkehrt oder neu gestartet wird. Dies wird automatisch vom SessionManager
durchgeführt, das die entsprechenden Callbacks für alle registrierten SessionManagerListener
-Instanzen ausgibt.
Registrierung eines benutzerdefinierten Channels
In Version 2 werden benutzerdefinierte Channels, die mit Cast.MessageReceivedCallback
implementiert wurden, im Cast.CastApi
registriert. In CAF werden benutzerdefinierte Channels stattdessen mit der Instanz CastSession
registriert. Die Registrierung kann über die Callback-Methode SessionManagerListener.onSessionStarted
erfolgen. Für 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 verworfen und sollte nicht verwendet werden. In CAF wird sie durch die neue Klasse RemoteMediaClient
ersetzt, die entsprechende Funktionen in einer einfacheren 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 beim Start der Sitzung, wenn die Webempfängeranwendung, mit der eine Verbindung hergestellt wird, den Medien-Namespace unterstützt.
Auf RemoteMediaClient
kann über die Methode getRemoteMediaClient
des CastSession
-Objekts zugegriffen werden.
In Version 2 geben alle Medienanfragen, die an RemoteMediaPlayer
gesendet werden, über einen PendingResult
-Callback ein RemoteMediaPlayer.MediaChannelResult
zurück.
In CAF geben alle Medienanfragen, die an RemoteMediaClient
gesendet werden, über einen PendingResult
-Callback ein RemoteMediaClient.MediaChannelResult
zurück, mit dem sich der Fortschritt und das letztendliche Ergebnis der Anfrage verfolgen lassen.
RemoteMediaPlayer
von Version 2 würde über RemoteMediaPlayer.OnStatusUpdatedListener
Benachrichtigungen über Änderungen am Status des Mediaplayers an den Webempfänger senden.
In CAF stellt RemoteMediaClient
entsprechende Callbacks über seine Schnittstelle RemoteMediaClient.Listener
bereit. Mit RemoteMediaClient
kann eine beliebige Anzahl von Listenern registriert werden. Dadurch können mehrere Absenderkomponenten die einzelne Instanz von RemoteMediaClient
teilen, die der Sitzung zugeordnet ist.
In Version 2 musste die Absenderanwendung die Benutzeroberfläche mit dem Status des Mediaplayers auf dem Webempfänger synchron halten.
In CAF übernimmt die Klasse UIMediaController
den größten Teil dieser Verantwortung.
Einleitendes Overlay
Version 2 bietet keine einführende Overlay-Benutzeroberfläche.
CAF bietet eine benutzerdefinierte Ansicht IntroductoryOverlay
, in der das Cast-Symbol hervorgehoben wird, wenn es Nutzern zum ersten Mal angezeigt wird.
Mini-Controller
In Version 2 müssen Sie einen neuen Mini-Controller in der Sender-App implementieren.
In CAF bietet 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.
Benachrichtigungen und Sperrbildschirm
In Version 2 werden vom SDK keine Controller für Benachrichtigungen und Sperrbildschirm bereitgestellt. Für dieses SDK müssen Sie diese Funktionen mithilfe der Android Framework APIs in Ihre Absender-App einbinden.
In CAF bietet das SDK eine NotificationsOptions.Builder
, mit der Sie Mediensteuerelemente für die Benachrichtigungs- und den Sperrbildschirm in der Absender-App erstellen können. Die Benachrichtigungs- und Sperrbildschirmsteuerelemente können mit dem 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();
}
Maximierter Controller
In Version 2 müssen Sie einen erweiterten Controller von Grund auf in der Sender-App implementieren.
CAF bietet eine UIMediaController
-Hilfsklasse, mit der Sie ganz einfach Ihren eigenen erweiterten Controller erstellen können.
CAF fügt ein vordefiniertes erweitertes Controller-Widget ExpandedControllerActivity
hinzu, das Sie Ihrer App einfach hinzufü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.
In CAF wird der Audiofokus automatisch verwaltet.
Fehlerprotokollierung
In CAF gibt es keine Logging-Optionen.
Beispiel-Apps und -Anwendungen
Es gibt Codelab-Anleitungen und Beispielanwendungen, die CAF verwenden.