Google Cast ist eine Technologie, mit der Benutzer Online-Inhalte an ein an einen Fernseher angeschlossenes Gerät wie Chromecast oder Android-TV senden können. Sobald der Inhalt auf dem Fernsehgerät verfügbar ist, können Benutzer ihn von seinem mobilen Gerät oder Computer aus steuern.
In diesem Lernprogramm erfahren Sie, wie Sie mithilfe des Cast SDK v3, das während der Google I / O-Konferenz 2016 angekündigt wurde, eine grundlegende Cast-fähige Anwendung für Android erstellen.
Google Cast besteht aus zwei Komponenten: Dem Empfänger, der im Wesentlichen eine Webseite ist, die zusammen mit Ihrem Inhalt auf einem Casting-Gerät angezeigt wird, und dem Sender, dem Clientprogramm, das Medien anfordert und die Wiedergabe steuert.
Bevor Sie Ihre Senderanwendung erstellen können, müssen Sie ein Konto in der Google Cast Developer Console registrieren und anschließend eine neue Empfängeranwendung erstellen und konfigurieren. Für die Registrierung eines Kontos müssen Sie eine einmalige Gebühr in Höhe von 5 US-Dollar entrichten. Sobald Ihr Konto erstellt wurde, können Sie auf das rote Symbol klicken NEUE ANWENDUNG HINZUFÜGEN Schaltfläche, um eine neue Empfängeranwendung zu erstellen.
Als Nächstes haben Sie drei Optionen: Benutzerdefinierter Empfänger, Stilierter Medienempfänger und Remote Display Receiver. Zur Vereinfachung verwenden Sie in diesem Lernprogramm einen Styled Media Receiver.
Auf dem nächsten Bildschirm können Sie einige grundlegende Einstellungen für Ihren Receiver auswählen, z. B. den Namen der Anwendung, eine optionale URL für ein CSS-Stylesheet, um das Erscheinungsbild des Receivers anzupassen, und die Möglichkeit, den Gastmodus und das Audio zu aktivieren. nur gießen.
Sobald Sie das Blau getroffen haben sparen Wenn Sie auf die Schaltfläche klicken, wird ein Bildschirm mit den grundlegenden Details Ihrer neuen Empfänger-App angezeigt. Sie werden feststellen, dass dieser Bildschirm auch Ihr neues enthält Anwendungs-ID. Sie müssen diesen Wert in Ihrer Android-Anwendung verwenden.
Es ist erwähnenswert, dass es trotz der Erstellung Ihrer Empfänger-App einige Stunden dauern kann, bis sie von Ihrer Sender-Anwendung erkannt werden kann.
Um zu testen, müssen Sie mindestens ein Gießgerät auf die Whitelist setzen. Sie können dies von der Google Cast Developer Console aus tun, indem Sie auf das rote Symbol klicken NEUES GERÄT HINZUFÜGEN Taste. Auf dem angezeigten Bildschirm können Sie die Seriennummer Ihres Geräts und eine Beschreibung eingeben, um eine Whitelist für das Testen mit Ihrer Empfängeranwendung zu erhalten.
Zu diesem Zeitpunkt sollten Sie einen Empfänger und ein Testgerät auf der weißen Liste haben, damit Sie mit dem Erstellen einer Android-Sender-App beginnen können. Wenn Sie Ihre Anwendung im Play Store erstellt und veröffentlicht haben, möchten Sie zur Veröffentlichung des Receivers zur Cast Developer Console zurückkehren, sodass jedes Casting-Gerät mit Ihrer Sender-App verwendet werden kann.
Als Erstes müssen Sie in Ihrer Android-App die Cast Framework- und Media Router-Bibliotheken unter der Abhängigkeiten
Knoten in Ihrem build.gradle Datei.
kompilieren 'com.android.support:mediarouter-v7:24.1.1' kompilieren 'com.google.android.gms: play-services-cast-framework: 9.4.0'
Als nächstes möchten Sie die Anwendungs-ID, die Sie beim Erstellen Ihres Empfängers erhalten haben, in Ihrem Gerät speichern strings.xml Datei.
(Ihre ID geht hier)
Der letzte Schritt des Installationsvorgangs umfasst die Internetberechtigung für Ihre Anwendung. Öffnen AndroidManifest.xml und fügen Sie die folgende Zeile vor Ihrem ein Anwendung
Knoten.
Nachdem Sie alle Einstellungen vorgenommen haben, können Sie mit dem Einfügen der Medienrouten-Schaltfläche in Ihre Anwendung fortfahren.
Die Routing-Schaltfläche ist das Symbol in der Symbolleiste einer Anwendung, das im Allgemeinen bedeutet, dass eine App das Casting für den Benutzer unterstützt.
Damit diese Schaltfläche in Ihrer Anwendung angezeigt wird Werkzeugleiste
, Am einfachsten ist es, sie in die XML-Datei Ihres Menüs aufzunehmen Aktivität
(Es wird auch empfohlen, dass dies in jeden geht Aktivität
in deiner App).
Als Nächstes müssen Sie dieses neue initialisieren MenuItem
in dem onCreateOptionsMenu
Methode Ihrer Aktivität
.
@Override public boolean onCreateOptionsMenu (Menü Menü) super.onCreateOptionsMenu (Menü); getMenuInflater (). inflate (Menü R.menu.menu_main); mMediaRouterButton = CastButtonFactory.setUpMediaRouteButton (getApplicationContext (), menu, R.id.media_route_menu_item); wahr zurückgeben;
Sobald die Schaltfläche für die Medienroute initialisiert ist, möchten Sie Ihrer Anwendung Status-Listener für das Casting hinzufügen.
Es gibt zwar mehrere Hörer, aber es gibt drei Diskussionspunkte, wenn Sie das Google Cast-Framework verwenden.
CastStateListener
: Dieser Listener überwacht den aktuellen Castungsstatus einer App. Es wird ausgelöst, wenn die App gewechselt hat VERBINDEN
, IN VERBINDUNG GEBRACHT
, NICHT VERBUNDEN
, oder NO_DEVICES_AVAILABLE
. AppVisibilityListener
: Dieser Listener hat zwei Methoden: onAppEnteredForeground
und onAppEnteredBackground
. Diese Methoden werden aufgerufen, wenn Ihre App von Ihrem Benutzer im Hintergrund ausgeführt wurde oder wenn der Benutzer Ihre Anwendung erneut geöffnet hat.SessionManagerListener
: Der letzte Zuhörer, den wir besprechen, ist auch am ausführlichsten. EIN Session
ist der Lebenszyklus der Benutzerinteraktion mit einem Casting-Gerät, der beginnt, wenn der Benutzer eine Verbindung zu einem Gerät hergestellt hat, durch Casting aufrechterhalten wird, und endet, wenn der Benutzer die Verbindung getrennt hat. Das Google Cast Android-Framework interagiert mit dem Session
durch die SessionManager
Objekt.Diese drei Listener können dem Google Cast-Framework wie folgt zugeordnet werden diese
In diesem Beispiel ist das Aktivität
das hat jede der oben genannten Schnittstellen implementiert.
CastContext.getSharedInstance (this) .addCastStateListener (this); CastContext.getSharedInstance (this) .addAppVisibilityListener (this); CastContext.getSharedInstance (this) .getSessionManager (). AddSessionManagerListener (this);
Möglicherweise haben Sie auch festgestellt, dass Sie auf die SessionManager
und Cast-Framework verwenden CastContext.getSharedInstance (Kontext)
. Das liegt daran, dass die CastContext
, Der Hauptinteraktionspunkt zwischen Ihrer App und dem Cast-Framework wird nur langsam initialisiert, um die App-Leistung zu verbessern.
Wenn dein Aktivität
nicht mehr aktiv ist, müssen Sie diese Listener entfernen.
CastContext.getSharedInstance (this) .removeAppVisibilityListener (this); CastContext.getSharedInstance (this) .removeCastStateListener (this); CastContext.getSharedInstance (this) .getSessionManager (). RemoveSessionManagerListener (this);
OptionsProvider
Damit Sie mit dem Cast-Framework etwas anfangen können, müssen Sie eine neue Klasse erstellen, die erweitert wird OptionsProvider
. In dieser Klasse können Sie verschiedene Optionen für Ihre Sender-App konfigurieren.
Wir werden das jetzt einfach halten und einfach eine zurücksenden CastOptions
Objekt aus der getCastOptions
Methode, mit der gespeicherte Sitzungen fortgesetzt und die Verbindung zu bereits laufenden Sitzungen wiederhergestellt werden kann (obwohl beide standardmäßig bereits aktiviert sind, werden sie hier als Beispiele bereitgestellt).
Das CastOptions
Objekt ist auch, wo Ihre Empfänger-App-ID Ihrem Absender zugeordnet ist. Obwohl die Methode getAdditionalSessionProviders
Muss in dieser Klasse deklariert werden, können wir sie für unsere Zwecke ignorieren.
public class CastOptionsProvider implementiert OptionsProvider @Override öffentliche CastOptions getCastOptions (Kontext-Kontext) CastOptions castOptions = new CastOptions.Builder () .setResumeSavedSession (true) .setEnableReconnectionService (true). bauen(); return castOptions; @Override öffentliche ListegetAdditionalSessionProviders (Kontextkontext) return null;
Sie müssen diese Klasse auch in Ihre aufnehmen AndroidManifest.xml Datei innerhalb einer Metadaten
Tag unter Ihrem Anwendung
Knoten.
Zu diesem Zeitpunkt sollte Ihre Anwendung in der Lage sein, Casting-Geräte mit der weißen Liste zu finden und über Ihre Anwendung eine Verbindung zu ihnen herzustellen.
Abhängig von dem Thema, das Sie in Ihrer App verwenden (z. B. Theme.AppCompat.Light.NoActionBar
), haben Sie möglicherweise ein seltsames Verhalten mit Farben im Casting-Gerätedialog festgestellt, z. B. weiße Schrift und Symbole auf weißem Hintergrund.
Sie können auch festlegen, dass Sie die Darstellung des Dialogfelds an Ihre Anwendung anpassen möchten. Sie können dies tun, indem Sie die beiden für das Besetzungsdialog verwendeten Stile überschreiben: Theme.MediaRouter.Light.DarkControlPanel
und Theme.MediaRouter.LightControlPanel
. Wenn Sie beispielsweise eine weiße Schrift auf weißem Hintergrund vorfinden, können Sie den folgenden Code in Ihre einfügen styles.xml Datei, um die Symbole und die Schriftfarbe so zu ändern, dass sie auf dem weißen Hintergrund schwarz sind.
Sobald Sie sich mit einem Casting-Gerät verbunden haben, möchten Sie wahrscheinlich, dass Ihre Benutzer Inhalte darauf übertragen. Glücklicherweise macht das Cast SDK diese Aufgabe sehr einfach. In Ihrer App möchten Sie feststellen, ob Ihr Benutzer eine Verbindung zu einem Gerät hergestellt hat SessionManager
hat einen Strom Session
und dass der Strom Session
hat ein RemoteMediaClient
Objekt damit verbunden.
if (CastContext.getSharedInstance (this) .getSessionManager (). getCurrentCastSession ()! = null && CastContext.getSharedInstance (this) .getSessionManager (). getCurrentCastSession (). getRemoteMediaClient ()! = null)
Sobald Sie wissen, dass die Anwendung mit a verbunden ist RemoteMediaClient
, Sie möchten eine erstellen Medieninformation
Objekt, das einen Link zu dem Remote-Inhalt enthält, den Sie wiedergeben möchten, sowie die Streaming- und Inhaltstypen für Ihre Medien. Wann Medieninformation
erstellt und gefüllt ist, können Sie die load -Methode auf dem aufrufen RemoteMediaClient
mit dem Casting des Inhalts beginnen. Mit dem folgenden Code können Sie beispielsweise eine Videodatei auf das Fernsehgerät übertragen.
RemoteMediaClient remoteMediaClient = CastContext.getSharedInstance (this) .getSessionManager (). GetCurrentCastSession (). GetRemoteMediaClient (); MediaInfo mediaInfo = new MediaInfo.Builder (getString (R.string.movie_link)) .setStreamType (MediaInfo.STREAM_TYPE_BUFFERED) .setContentType ("videos / mp4") .build (); remoteMediaClient.load (mediaInfo, true, 0);
Die Empfänger- und UI-Komponenten im Cast SDK verwenden a MediaMetadata
Objekt zum Speichern und Referenzieren von Informationen zu den gerade abgespielten Medien. Sie können diesem Objekt Werte hinzufügen, indem Sie die von der Klasse bereitgestellten Schlüssel verwenden, und Sie können Bild-URLs mithilfe von verwenden Bild hinzufügen
Methode.
MediaMetadata Metadata = neue MediaMetadata (MediaMetadata.MEDIA_TYPE_MOVIE); metadata.putString (MediaMetadata.KEY_TITLE, "Titel"); metadata.putString (MediaMetadata.KEY_SUBTITLE, "Untertitel"); metadata.addImage (new WebImage (Uri.parse (getString (R.string.movie_poster)))));
Einmal die MediaMetadata
Objekt erstellt wird, können Sie es mit den Inhalten verknüpfen Medieninformation
.
MediaInfo mediaInfo = new MediaInfo.Builder (getString (R.string.movie_link)) .setStreamType (MediaInfo.STREAM_TYPE_BUFFERED) .setContentType ("videos / mp4") .setMetadata (metadata) .build ();
Während das Cast-SDK die Logik für das Verbinden und Casting von Inhalten mit dem Fernsehgerät übernimmt, bietet es auch mehrere Komponenten der Benutzeroberfläche, mit denen Entwickler die Richtlinien für die Casting-Benutzeroberfläche erfüllen können.
Wenn Ihr Nutzer Ihre Anwendung zum ersten Mal öffnet, wird empfohlen, dass Sie ihm mitteilen, dass Sie Google Cast unterstützen. Sie können dies tun, indem Sie eine Einführungs-Overlay
, Dadurch wird die Besetzungsschaltfläche hervorgehoben, sobald sie zum ersten Mal verfügbar ist.
Um die Einführungs-Overlay
, Als Erstes sollten Sie sie als Member-Variable oben in Ihrer Hauptaktivität hinzufügen.
private IntroductoryOverlay mIntroductoryOverlay;
Wenn Sie ein gemeinsames Objekt für die Überlagerung haben, können Sie eine Methode erstellen, mit der geprüft wird, ob die Schaltfläche des Medienrouters angezeigt wird. Wenn angezeigt, wird die Überlagerung angezeigt.
Diese Komponente wird mit einem einfachen Builder-Muster konkretisiert, das ein akzeptiert String
für den Text eine Farbressourcen-ID und einige andere Anpassungsattribute. In den meisten Fällen möchten Sie auch sicherstellen, dass Sie anrufen setSingleTime ()
, so dass das Overlay für den Benutzer immer nur einmal angezeigt wird.
private void showIntroductoryOverlay () if (mIntroductoryOverlay! = null) mIntroductoryOverlay.remove (); if ((mMediaRouterButton! = null) && mMediaRouterButton.isVisible ()) new Handler (). post (new Runnable ()) @Override public void run () mIntroductoryOverlay = new Einführung Overlay.Builder (MainActivity.this, mMedia) .setTitachetext ("Einführungstext") .setOverlayColor (R.color.colorPrimary) .setSingleTime () .setOnOverlayDismissedListener (neuer IntroductoryOverlay.OnOverlayDismissedListener () @Override-Modus). ; mIntroductoryOverlay.show (););
Nachdem Sie nun eine Methode zum Anzeigen der Überlagerung erstellt haben, müssen Sie sie einfach aufrufen. Es gibt zwei Punkte, an denen Sie diese Methode hinzufügen sollten: in onCreateOptionsMenu
, und in onCastStateChanged
von deiner CastStateListener
wenn der Staat nicht ist NO_DEVICES_AVAILABLE
. Dadurch werden beide Eventualitäten behandelt, wann die Routing-Schaltfläche angezeigt werden könnte.
@Override public void onCastStateChanged (int newState) if (newState! = CastState.NO_DEVICES_AVAILABLE) showIntroductoryOverlay (); @Override public boolean onCreateOptionsMenu (Menü menu) super.onCreateOptionsMenu (menu); getMenuInflater (). inflate (Menü R.menu.menu_main); mMediaRouterButton = CastButtonFactory.setUpMediaRouteButton (getApplicationContext (), menu, R.id.media_route_menu_item); showIntroductoryOverlay (); wahr zurückgeben;
An diesem Punkt sollten Sie in der Lage sein, Ihre App zu starten und die Überlagerung zu sehen, wie in der nächsten Abbildung gezeigt. Wenn Sie es zu Testzwecken erneut anzeigen müssen, können Sie die Daten Ihrer Anwendung löschen und erneut öffnen.
Während des Castings sollten Sie ein einfaches UI-Widget für die Steuerung von Inhalten auf dem Fernsehgerät des Benutzers bereitstellen können. Google hat dies durch die Bereitstellung der ExpandedControllerActivity
Klasse innerhalb des Cast SDK.
Erstellen Sie dazu eine neue Java-Klasse, und erweitern Sie sie ExpandedControllerActivity
. Dieses Tutorial erstellt einen Aufruf ExpandedControlsActivity
. Sobald Ihre Aktivität erstellt wurde, aktualisieren Sie onCreateOptionsMenu
Um die Casting-Routing-Schaltfläche in die Symbolleiste aufzunehmen.
public class ExpandedControlsActivity erweitert ExpandedControllerActivity @Override public boolean onCreateOptionsMenu (Menü menu) super.onCreateOptionsMenu (menu); getMenuInflater (). inflate (Menü R.menu.menu_main); CastButtonFactory.setUpMediaRouteButton (dieses Menü, R.id.media_route_menu_item); wahr zurückgeben;
Als nächstes öffnen Sie Ihre OptionsProvider
Klasse. Sie wollen in die gehen getCastOptions
Methode und erstellen Sie eine CastMediaOptions
Objekt, das an Ihr bindet ExpandedControllerActivity
. Einmal dein CastMediaOptions
Objekt erstellt wird, können Sie es mit dem verknüpfen CastOptions
Element, das von der Methode zurückgegeben wird.
CastMediaOptions mediaOptions = new CastMediaOptions.Builder () .setExpandedControllerActivityClassName (ExpandedControlsActivity.class.getName ()) .build (); CastOptions castOptions = new CastOptions.Builder () .setResumeSavedSession (true) .setEnableReconnectionService (true) .setReceiverApplicationId (context.getString (R.string.cast_app_id)) .setCastMediaOptions) .build (); return castOptions;
Endlich eine Arbeit bekommen ExpandedControllerActivity
, Sie müssen es in einschließen AndroidManifest.xml, wie so.
Sie sollten das bemerken Aktivität
Knoten hat eine Thema
Eigenschaftssatz. Dieser Stil wird verwendet, um das Format optional anzupassen ExpandedControllerActivity
und die angezeigten Schaltflächen.
Der Controller besteht aus vier anpassbaren Tastenfeldern, in der Mitte eine Wiedergabe / Pause-Taste. Mit einem neuen Stil und einer Arrayressource können Sie festlegen, welche Schaltflächen angezeigt werden. Im Arrays.xml, Ich habe ein neues hinzugefügt Array
Steckplatz 1 auf leer, Steckplatz 2 auf den 30-Sekunden-Rückspulknopf, Steckplatz 3 (erster Eintrag rechts neben dem Wiedergabe / Pause-Schalter) auf 30 Sekunden vorspulen und den letzten Steckplatz für die Stummschaltung.
- @ id / cast_button_type_empty
- @ id / cast_button_type_rewind_30_seconds
- @ id / cast_button_type_forward_30_seconds
- @ id / cast_button_type_mute_toggle
Sie können dies dann zuordnen Array
mit Ihrer Aktivität
indem Sie Ihr neues erstellen Stil
Ressource und das Überschreiben der castExpandedControllerStyle
Wert mit einem neuen Stil
das erstreckt sich CastExpandedController
.
An diesem Punkt sollten Sie in der Lage sein, das Bild in Ihrem Routerdialogfeld für Casted Media anzuklicken, um den neuen Controller zu öffnen Aktivität
, oder starten Sie es selbst aus Ihrer Anwendung heraus startActivity
Anruf.
startActivity (new Intent (this, ExpandedControlsActivity.class));
Wenn ein Benutzer Inhalte an sein Fernsehgerät sendet, besteht eine gute Chance, dass er Ihre App nicht im Vordergrund lässt oder das Telefon nicht gesperrt ist. Wenn sie von Ihrer App weg navigieren, möchten Sie ihnen eine einfache Möglichkeit bieten, den Inhalt Ihrer App zu steuern. Sie können dies tun, indem Sie Ihrer App eine Benachrichtigung hinzufügen, wenn diese für Lollipop und andere Geräte nicht im Vordergrund steht. Das Cast SDK übernimmt das Erstellen eines Sperrbildschirms RemoteControlClient
für KitKat und frühere Geräte.
Das Hinzufügen von Steuerelementen für Benachrichtigungen / Sperren ist ziemlich unkompliziert, da dies alles in der getCastOptions
Methode Ihrer OptionsProvider
(CastOptionsProvider.java für dieses Tutorial).
Zuerst müssen Sie ein erstellen Anordnungsliste
von Strings, die die Schaltflächen enthalten, die Sie für Ihre Steuerelemente benötigen. Als Nächstes können Sie ein erstellen int
Array, das die Indizes der Schaltflächen enthält, die angezeigt werden sollen, wenn sich die Benachrichtigung im Kompaktmodus befindet.
Sobald Sie Ihre beiden Arrays erstellt haben, erstellen Sie ein Benachrichtigungsoptionen
Objekt, das die Aktionen an die neue Benachrichtigung bindet, und ordnen Sie ein Aktivität
zu öffnen, wenn die Benachrichtigung ausgewählt ist. Für dieses Beispiel verwenden wir einfach die ExpandedControlsActivity
dass wir im letzten Abschnitt erstellt haben.
Schließlich können Sie die Benachrichtigung zu Ihrem hinzufügen CastMediaOptions
.
ListebuttonActions = neue ArrayList <> (); buttonActions.add (MediaIntentReceiver.ACTION_TOGGLE_PLAYBACK); buttonActions.add (MediaIntentReceiver.ACTION_STOP_CASTING); int [] compatButtonActionsIndicies = new int [] 0, 1; NotificationOptions notificationOptions = new NotificationOptions.Builder () .setActions (buttonActions, compatButtonActionsIndicies) .setTargetActivityClassName (ExpandedControlsActivity.class.getName ()) .build ()); CastMediaOptions mediaOptions = new CastMediaOptions.Builder () .setNotificationOptions (notificationOptions) .setExpandedControllerActivityClassName (ExpandedControlsActivity.class.getName ()) .build ());
Wenn Ihre Benutzer jetzt Inhalte auf Ihr Fernsehgerät übertragen und den Bildschirm sperren oder von Ihrer App weg navigieren, wird eine Benachrichtigung angezeigt, in der sie den Inhalt auf dem großen Bildschirm steuern können, während sie weiterhin mit ihrem Telefon interagieren. Wenn Sie auf die Benachrichtigung außerhalb der Steuerelemente klicken, wird Ihre App mit der wieder in den Vordergrund gerückt ExpandedControlsActivity
, So können Sie Ihren Benutzern eine feinere Kontrolle über das Seherlebnis bieten.
Das letzte UI-Widget, über das Sie in diesem Lernprogramm lernen werden, ist das MiniControllerFragment
. Dieses Element kann in Ihre Aktivitätslayoutdateien eingefügt werden. Wenn Ihre App Inhalte umsetzt, wird sie automatisch sichtbar und bietet einen leicht zugänglichen Controller für Ihre Benutzer, während sie Ihre App durchsuchen. Obwohl dies die letzte Komponente ist, die wir diskutieren werden, ist sie bei weitem die einfachste Implementierung. Sie müssen es einfach in Ihre Layout-Dateien aufnehmen, wie es so ist.
Wenn Sie auf dieses Element außerhalb des Abspiel- / Pause-Schalters klicken, wird Ihre ExtendedControllerActivity
wird angezeigt, so dass Ihre Benutzer einfachen Zugriff auf den Inhalt ihres Fernsehers haben.
In diesem Lernprogramm haben Sie viel über das neue Google Cast SDK für Android, die darin enthaltenen Komponenten der Benutzeroberfläche und die Erstellung einer grundlegenden Empfängeranwendung für das Casting erfahren. Was Sie hier besprochen haben, hilft Ihnen beim Erstellen der häufigsten Arten von Casting-Anwendungen. Google bietet jedoch auch Funktionen, mit denen Sie Cast-fähige Spiele und benutzerdefinierte Empfängeranwendungen schnell erstellen können.