Mit dem folgenden Verfahren können Sie die Android-Absender-App vom Cast SDK v2 in den CAF-Sender umwandeln. Dieser basiert auf dem CastContext-Singleton.
Das Cast CAF Sender SDK verwendet CastContext, um den GoogleAPIClient in Ihrem Namen zu verwalten. CastContext verwaltet Lebenszykluszyklen, Fehler und Callbacks für Sie, was die Entwicklung einer Cast-Anwendung erheblich vereinfacht.
Einführung
- Der CAF-Absender 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 verantwortlich sind (
com.google.android.gms.cast.framework.*
) - Der CAF-Absender stellt Widgets bereit, die den UX-Anforderungen für Cast entsprechen. Version 2 hat keine UI-Komponenten bereitgestellt und erforderte die Implementierung dieser Widgets.
- Für die Verwendung der Cast API ist GoogleApiClient nicht mehr erforderlich.
- Untertitel in CAF Sender ähneln Version 2.
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 mindestens von CAF unterstützte Android SDK-Version ist 9 (Gingerbread).
Initialisierung
In CAF ist für das Cast-Framework ein expliziter Initialisierungsschritt erforderlich. Dazu wird der Singleton CastContext
mit einem entsprechenden OptionsProvider
initialisiert, 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 „application“-Tag 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
auf sichere Weise 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 V2 nicht erforderlich.
Geräteerkennung
In CAF wird der Erkennungsprozess automatisch durch das Framework gestartet und beendet, wenn die Anwendung in den Vordergrund verschoben bzw. in den Hintergrund verschoben wird. MediaRouteSelector
und MediaRouter.Callback
sollten nicht verwendet werden.
Streaming-Schaltfläche und Streaming-Dialogfeld
Wie in v2 werden diese Komponenten von der MediaRouter-Supportbibliothek bereitgestellt.
Das Cast-Symbol wird immer noch durch den MediaRouteButton
implementiert und kann Ihrer Aktivität (über einen ActionBar
oder einen Toolbar
) als Menüelement 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 Methode onCreateOptionMenu()
jeder Aktivität. Verwenden Sie dazu 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 das Streaming-Dialogfeld automatisch eingeblendet.
Gerätesteuerung
In CAF wird die Gerätesteuerung hauptsächlich vom Framework übernommen. Die Absenderanwendung muss keine Verbindung zum Gerät herstellen (und sollte dies auch nicht versuchen). Die Anwendung des Webempfängers wird über GoogleApiClient
gestartet. Die Interaktion zwischen dem Absender und dem Webempfänger wird jetzt als „Sitzung“ dargestellt. Die Klasse SessionManager
übernimmt den Sitzungslebenszyklus und startet und beendet Sitzungen automatisch als Reaktion auf Nutzerbewegungen: Eine Sitzung wird gestartet, wenn der Nutzer ein Cast-Gerät im Streaming-Dialogfeld auswählt und beendet wird, wenn der Nutzer auf die Schaltfläche „Streaming beenden“ im Streaming-Dialogfeld tippt oder wenn die Absender-App selbst beendet wird. Die Senderanwendung kann über Lebenszyklusereignisse der Sitzung benachrichtigt werden, indem eine SessionManagerListener
mit SessionManager
registriert wird. Mit den SessionManagerListener
-Callbacks werden Callback-Methoden für alle Lebenszyklusereignisse der Sitzung definiert.
Die Klasse CastSession
stellt eine Sitzung mit einem Übertragungsgerät dar. Die Klasse hat Methoden zum Steuern der Gerätelautstärke und zum Stummschalten von Zuständen, die zuvor in V2 mit Methoden in Cast.CastApi
möglich waren.
In v2 haben die Callbacks für Cast.Listener
Benachrichtigungen über Änderungen am Gerätestatus bereitgestellt, einschließlich Lautstärke, Stummschaltung, Stand-by-Status usw.
In CAF werden Benachrichtigungen zu Statusänderungen und Stummschaltungen weiterhin über Callback-Methoden im Cast.Listener
gesendet. Diese Listener sind unter CastSession
registriert.
Alle verbleibenden Gerätestatusbenachrichtigungen werden über CastStateListener
-Callbacks gesendet. Diese Listener sind im CastSession
registriert. Heben Sie die Registrierung von Listenern auch dann auf, wenn die zugehörigen Fragmente, Aktivitäten oder Apps in den Hintergrund verschoben werden.
Verbindungslogik
Wie bei V2 wird CAF versuchen, Netzwerkverbindungen wiederherzustellen, die aufgrund vorübergehender Verluste des WLAN-Signals oder anderer Netzwerkfehler verloren gehen. Dies erfolgt jetzt auf Sitzungsebene. Eine Sitzung kann bei Unterbrechung der Verbindung in den Status „Gesperrt“ übergehen und nach dem Wiederherstellen der Verbindung in den Status „Verbunden“ übergehen. Das Framework sorgt dafür, dass die Verbindung zur Web Receiver App und zu allen Cast-Kanälen wiederhergestellt wird.
Darüber hinaus fügt CAF die automatische Sitzungswiederaufnahme hinzu, die standardmäßig aktiviert ist und über CastOptions
deaktiviert werden kann.
Wenn die Absenderanwendung im Hintergrund gesendet oder durch Löschen oder aufgrund eines Absturzes beendet wird, versucht das Framework, diese Sitzung fortzusetzen, wenn die Absenderanwendung in den Vordergrund zurückkehrt oder neu gestartet wird. Dies wird automatisch von der SessionManager
verarbeitet, die die entsprechenden Callbacks für alle registrierten SessionManagerListener
-Instanzen ausgibt.
Benutzerdefinierte Kanalregistrierung
In v2 werden benutzerdefinierte Kanäle (mit Cast.MessageReceivedCallback
implementiert) bei Cast.CastApi
registriert. In CAF werden benutzerdefinierte Channels stattdessen bei der Instanz CastSession
registriert. Die Registrierung kann in der SessionManagerListener.onSessionStarted
-Callback-Methode erfolgen. Bei Medienanwendungen ist es nicht mehr erforderlich, den Medienkontrollkanal über Cast.CastApi.setMessageReceivedCallbacks
explizit zu registrieren. Weitere Informationen finden Sie im folgenden Abschnitt.
Mediensteuerung
Die V2-Klasse RemoteMediaPlayer
wurde verworfen und sollte nicht mehr verwendet werden. In CAF wird sie durch die neue Klasse RemoteMediaClient
ersetzt, die eine entsprechende Funktionalität in einer praktischeren API bietet. Sie müssen dieses Objekt nicht explizit initialisieren oder registrieren. Das Framework instanziiert das Objekt automatisch und registriert den zugrunde liegenden Medienkanal zum Zeitpunkt der Sitzung, wenn die Web Receiver-Anwendung verbunden ist, um den Medien-Namespace zu unterstützen.
Auf die RemoteMediaClient
kann als Methode getRemoteMediaClient
des CastSession
-Objekts zugegriffen werden.
In Version 2 wird bei allen Medienanfragen, die für RemoteMediaPlayer
gesendet werden, über einen PendingResult
-Callback ein RemoteMediaPlayer.MediaChannelResult
zurückgegeben.
In CAF wird für alle Medienanfragen, die im RemoteMediaClient
ausgegeben werden, ein RemoteMediaClient.MediaChannelResult
über einen PendingResult
-Callback zurückgegeben, mit dem der Fortschritt und das endgültige Ergebnis der Anfrage erfasst werden kann.
Die V2-RemoteMediaPlayer
sendet Benachrichtigungen über Änderungen am Mediaplayer-Status auf dem Webempfänger über die RemoteMediaPlayer.OnStatusUpdatedListener
.
In CAF stellt RemoteMediaClient
entsprechende Callbacks über die RemoteMediaClient.Listener
-Schnittstelle bereit. Mit der RemoteMediaClient
kann eine beliebige Anzahl von Listenern registriert werden. So können sich mehrere Absenderkomponenten die einzelne Instanz der RemoteMediaClient
teilen, die der Sitzung zugeordnet ist.
In Version 2 musste die Absenderanwendung die Belastung der Benutzeroberfläche vornehmen, die mit dem Status des Mediaplayers auf dem Webempfänger synchron war.
In CAF übernimmt der Kurs UIMediaController
die meiste Verantwortung.
Einführendes Overlay
V2 bietet keine einführende Overlay-Benutzeroberfläche.
CAF bietet eine benutzerdefinierte Ansicht IntroductoryOverlay
, um das Cast-Symbol hervorzuheben, wenn es Nutzern zum ersten Mal angezeigt wird.
Mini-Controller
In Version 2 müssen Sie einen Mini-Controller von Grund auf in der Absender-App implementieren.
In CAF enthält 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.
Benachrichtigungs- und Sperrbildschirm
In Version 2 werden vom SDK keine Controller für den Benachrichtigungs- und den Sperrbildschirm bereitgestellt. Für dieses SDK müssen Sie diese Funktionen mithilfe der Android Framework APIs in die Absender-App einbinden.
In CAF bietet das SDK eine NotificationsOptions.Builder
, mit der Sie Mediensteuerelemente für die Benachrichtigung und den Sperrbildschirm in der Absender-App erstellen können. Die Benachrichtigungs- und Sperrbildschirmsteuerelemente können mit CastOptions
beim Initialisieren der 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();
}
Controller maximiert
In Version 2 müssen Sie einen erweiterten Controller von Grund auf in der Absender-App implementieren.
CAF bietet eine UIMediaController
-Hilfsklasse, mit der Sie ganz einfach einen eigenen erweiterten Controller erstellen können.
CAF fügt das vordefinierte erweiterte Controller-Widget ExpandedControllerActivity
hinzu. Sie können es einfach Ihrer App hinzufügen. Sie müssen keinen benutzerdefinierten erweiterten Controller 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.
Beispielapps
Wir haben Codelab-Anleitungen und Beispielanwendungen, die CAF verwenden.