Mit der folgenden Anleitung kannst du deine Android-Sender-App vom Cast SDK v2 in CAF Sender konvertieren, das auf dem CastContext-Singleton basiert.
Das Cast CAF Sender SDK verwendet CastContext, um den 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 über den Android SDK Manager als Teil der Google Play-Dienste bereitgestellt.
- Es wurden neue Pakete hinzugefügt, die die Einhaltung der Checkliste für das Google Cast-Design (
com.google.android.gms.cast.framework.*
) übernehmen. - CAF Sender bietet Widgets, die den UX-Anforderungen von Cast entsprechen. Version 2 bot keine UI-Komponenten und erforderte die Implementierung dieser Widgets.
- Die Verwendung von GoogleApiClient ist für die Verwendung der Cast API nicht mehr erforderlich.
- Untertitel in CAF-Sendern ähneln denen in Version 2.
Abhängigkeiten
V2 und CAF haben dieselben Abhängigkeiten von den Support Libraries und Google Play-Diensten (9.2.0 oder höher), wie im Leitfaden zu den Funktionen der Support Library beschrieben.
Die Mindestversion des Android SDK, die von CAF unterstützt wird, ist 9 (Gingerbread).
Initialisierung
In CAF ist ein expliziter Initialisierungsschritt für das Cast-Framework erforderlich. Dazu muss das CastContext
-Singleton initialisiert werden. Dazu wird ein geeigneter OptionsProvider
verwendet, um die Web-Empfänger-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 die 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>
CastContext
in der onCreate
-Methode jeder Aktivität verzögert initialisieren:
private CastContext mCastContext;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.video_browser);
setupActionBar();
mCastContext = CastContext.getSharedInstance(this);
}
In Version 2 waren diese Schritte nicht erforderlich.
Geräteerkennung
In CAF wird der Erkennungsprozess automatisch vom Framework gestartet und angehalten, 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 Version 2 werden diese Komponenten von der MediaRouter-Supportbibliothek bereitgestellt.
Die Schaltfläche „Streamen“ wird weiterhin über das MediaRouteButton
implementiert und kann deiner Aktivität als Menüpunkt (mithilfe eines ActionBar
oder Toolbar
) 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 onCreateOptionMenu()
-Methode jeder Aktivität, indem Sie CastButtonFactory
verwenden, 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 jemand auf die Schaltfläche tippt, wird automatisch das Übertragungsdialogfeld angezeigt.
Gerätesteuerung
In CAF wird die Gerätesteuerung weitgehend vom Framework übernommen. Die Senderanwendung muss nicht (und sollte nicht versuchen) die Verbindung zum Gerät herstellen und die Web-Empfängeranwendung mit GoogleApiClient
starten. Die Interaktion zwischen Absender und Webempfänger wird jetzt als „Sitzung“ dargestellt. Die Klasse SessionManager
verwaltet den Sitzungszyklus und startet und beendet Sitzungen automatisch als Reaktion auf Nutzergesten: Eine Sitzung wird gestartet, wenn der Nutzer im Streaming-Dialogfeld ein Streaminggerät auswählt, und beendet, wenn der Nutzer im Streaming-Dialogfeld auf die Schaltfläche „Streaming beenden“ tippt oder die Sender-App selbst beendet wird. Die Senderanwendung kann über Sitzungslebenszyklusereignisse benachrichtigt werden, indem eine SessionManagerListener
beim SessionManager
registriert wird. Die SessionManagerListener
-Callbacks definieren Callback-Methoden für alle Ereignisse des Sitzungslebenszyklus.
Die Klasse CastSession
stellt eine Sitzung mit einem Cast-Gerät dar. Die Klasse enthält Methoden zum Steuern der Gerätelautstärke und des Stummschaltungsstatus, was in Version 2 zuvor mithilfe von Methoden auf Cast.CastApi
erfolgte.
In Version 2 wurden über die Callbacks von Cast.Listener
Benachrichtigungen zu Änderungen des Gerätestatus gesendet, z. B. zu Lautstärke, Stummschaltungsstatus und Standbystatus.
In CAF werden Benachrichtigungen zu Änderungen des Lautstärke-/Stummschaltungsstatus weiterhin über Rückrufmethoden in der Cast.Listener
gesendet. Diese Listener sind bei CastSession
registriert.
Alle verbleibenden Benachrichtigungen zum Gerätestatus werden über CastStateListener
-Callbacks gesendet. Diese Listener sind beim CastSession
registriert. Listener müssen auch dann abgemeldet werden, wenn die zugehörigen Fragmente, Aktivitäten oder Apps in den Hintergrund wechseln.
Logik für die Wiederherstellung der Verbindung
Wie bei Version 2 versucht CAF, Netzwerkverbindungen wiederherzustellen, die aufgrund eines vorübergehenden WLAN-Signalausfalls oder anderer Netzwerkfehler unterbrochen wurden. Dies geschieht jetzt auf Sitzungsebene. Eine Sitzung kann in den Status „Ausgesetzt“ wechseln, wenn die Verbindung unterbrochen wird, und wieder in den Status „Verbunden“, wenn die Verbindung wiederhergestellt wird. Das Framework stellt dabei die Verbindung zur Web-Empfängeranwendung und zu allen Cast-Kanälen wieder her.
Außerdem bietet CAF die automatische Sitzungsfortsetzung, die standardmäßig aktiviert ist und über CastOptions
deaktiviert werden kann.
Wenn die Senderanwendung während einer laufenden Übertragungssitzung in den Hintergrund verschoben oder beendet wird (durch Wischen oder einen Absturz), versucht das Framework, diese Sitzung fortzusetzen, wenn die Senderanwendung wieder in den Vordergrund wechselt oder neu gestartet wird. Dieser Vorgang wird automatisch vom SessionManager
verwaltet, der die entsprechenden Rückrufe an alle registrierten SessionManagerListener
-Instanzen sendet.
Benutzerdefinierte Channelregistrierung
In Version 2 werden benutzerdefinierte Channels (implementiert mit Cast.MessageReceivedCallback
) beim Cast.CastApi
registriert. In 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. In 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 erstellt das Objekt automatisch und registriert den zugrunde liegenden Medienkanal zu Beginn der Sitzung, wenn die Web-Empfä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 wird bei allen über den RemoteMediaPlayer
gesendeten Medienanfragen über einen PendingResult
-Callback ein RemoteMediaPlayer.MediaChannelResult
zurückgegeben.
In CAF geben alle über die RemoteMediaClient
gesendeten Medienanfragen über einen PendingResult
-Callback eine RemoteMediaClient.MediaChannelResult
zurück, mit der der Fortschritt und das Ergebnis der Anfrage verfolgt werden können.
Die RemoteMediaPlayer
der Version 2 sendet Benachrichtigungen über Änderungen am Status des Mediaplayers an den Webreceiver über die RemoteMediaPlayer.OnStatusUpdatedListener
.
In CAF bietet die RemoteMediaClient
über die RemoteMediaClient.Listener
-Schnittstelle entsprechende Rückrufe. Bei der RemoteMediaClient
kann eine beliebige Anzahl von Listenern registriert werden. So können mehrere Senderkomponenten die einzelne Instanz der RemoteMediaClient
gemeinsam nutzen, die der Sitzung zugeordnet ist.
In Version 2 musste die Senderanwendung dafür sorgen, dass die Benutzeroberfläche mit dem Status des Mediaplayers auf dem Webempfänger synchronisiert blieb.
In CAF übernimmt die Klasse UIMediaController
den Großteil dieser Verantwortung.
Einführungs-Overlay
V2 bietet keine Einführungs-Overlay-Benutzeroberfläche.
CAF bietet eine benutzerdefinierte Ansicht,IntroductoryOverlay
um die Schaltfläche „Streamen“ hervorzuheben, wenn sie Nutzern zum ersten Mal angezeigt wird.
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 du der App-Layoutdatei der Aktivitäten hinzufügen kannst, in denen der Mini-Controller angezeigt werden soll.
Benachrichtigungen und Sperrbildschirm
In Version 2 werden keine Steuerelemente für Benachrichtigungen und Sperrbildschirme vom SDK bereitgestellt. Für dieses SDK müssen Sie diese Funktionen mithilfe der Android-Framework-APIs in Ihre Sender-App einbinden.
In CAF bietet das SDK die Funktion NotificationsOptions.Builder
, mit der du Mediensteuerelemente für die Benachrichtigung und den Sperrbildschirm in die Sender-App einbinden kannst. Die Steuerelemente für Benachrichtigungen und Sperrbildschirm können mit CastOptions
aktiviert werden, wenn du die CastContext
initialisierst.
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 in der Sender-App einen maximierten Controller von Grund auf implementieren.
CAF bietet eine Hilfsklasse UIMediaController
, mit der Sie ganz einfach Ihren eigenen erweiterten Controller erstellen können.
CAF fügt ein vordefiniertes erweitertes Controller-Widget ExpandedControllerActivity
hinzu, das Sie einfach Ihrer App 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.
Bei CAF wird der Audiofokus automatisch verwaltet.
Fehlerprotokollierung
In CAF gibt es keine Logging-Optionen.
Beispielanwendungen
Wir haben Codelab-Anleitungen und Beispiel-Apps, die CAF verwenden.