Google Play-Dienste: Google Cast v3 und Medien
() translation by (you can also view the original English article)
Google Cast ist eine Technologie, mit der Benutzer Online-Inhalte an ein Gerät wie Chromecast oder Android TV senden können, das an einen Fernseher angeschlossen ist. Sobald der Inhalt auf dem Fernseher verfügbar ist, können Benutzer ihn von ihrem mobilen Gerät oder Computer aus steuern.
In diesem Tutorial erfahren Sie, wie Sie mit dem 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.
Cast Console Setup
Google Cast besteht aus zwei Komponenten: dem Empfänger, bei dem es sich im Wesentlichen um eine Webseite handelt, die auf einem Casting-Gerät mit Ihren Inhalten angezeigt wird, und dem Absender, dem Client-Programm, das Medien anfordert und die Wiedergabe steuert.
Bevor Sie Ihre Absenderanwendung 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. Um ein Konto zu registrieren, müssen Sie eine einmalige Gebühr von 5 USD zahlen. Sobald Ihr Konto erstellt wurde, können Sie auf die rote Schaltfläche NEUE ANWENDUNG HINZUFÜGEN klicken, um eine neue Empfängeranwendung zu erstellen.
Als Nächstes haben Sie drei Optionen: Benutzerdefinierter Empfänger, Styled Media Receiver und Remote Display Receiver. In diesem Tutorial verwenden Sie der Einfachheit halber einen Styled Media Receiver.



Auf dem nächsten Bildschirm können Sie einige Grundeinstellungen für Ihren Receiver auswählen, wie z. B. den Anwendungsnamen, eine optionale URL für ein CSS-Stylesheet, um das Aussehen des Receivers anzupassen, und die Möglichkeit, den Gastmodus und das reine Audio-Casting zu aktivieren.



Sobald Sie auf die blaue Schaltfläche Speichern klicken, wird ein Bildschirm angezeigt, auf dem die grundlegenden Details Ihrer neuen Empfänger-App angezeigt werden. Sie werden feststellen, dass dieser Bildschirm auch Ihre neue Anwendungs-ID enthält. 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 Ihre Absender-Anwendung sie erkennt.
Zum Testen müssen Sie mindestens ein Casting-Gerät auf die weiße Liste setzen. Sie können dies über die Google Cast Developer Console tun, indem Sie auf die rote Schaltfläche NEUES GERÄT HINZUFÜGEN klicken. Auf dem angezeigten Bildschirm können Sie die Seriennummer Ihres Geräts und eine Beschreibung eingeben, um es zum Testen mit Ihrer Empfängeranwendung auf die weiße Liste zu setzen.



Zu diesem Zeitpunkt sollten Sie einen Empfänger erstellen und ein Testgerät auf die weiße Liste setzen, damit Sie mit dem Erstellen einer Android-Absender-App beginnen können. Wenn Sie Ihre Anwendung im Play Store erstellt und veröffentlicht haben, möchten Sie zur Cast Developer Console zurückkehren, um Ihren Receiver zu veröffentlichen, sodass jedes Casting-Gerät mit Ihrer Absender-App verwendet werden kann.
Android-Setup
Das erste, was Sie in Ihrer Android-App tun müssen, ist, die Cast Framework- und Media Router-Bibliotheken unter dem dependencies
-Knoten in Ihre build.gradle-Datei aufzunehmen.
1 |
compile 'com.android.support:mediarouter-v7:24.1.1' |
2 |
compile '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 Ihrer Datei strings.xml speichern.
1 |
<string name="cast_app_id">(your ID goes here)</string> |
Der letzte Schritt im Einrichtungsprozess besteht darin, die Internetberechtigung für Ihre Anwendung einzuschließen. Öffnen Sie AndroidManifest.xml und fügen Sie die folgende Zeile vor Ihrem application
-Knoten ein.
1 |
<uses-permission android:name="android.permission.INTERNET" /> |
Nachdem Sie die Einrichtung abgeschlossen haben, können Sie die Schaltfläche für die Medienroute in Ihre Anwendung aufnehmen.
Anzeigen einer Routing-Schaltfläche und Herstellen einer Verbindung zu Cast-Geräten
Die Routing-Schaltfläche ist das Symbol in der Symbolleiste einer Anwendung, das im Allgemeinen anzeigt, dass eine App das Casting für den Benutzer unterstützt.



Damit diese Schaltfläche in Toolbar
Ihrer Anwendung angezeigt wird, können Sie sie am einfachsten in die XML-Menüdatei für Ihre Aktivity
aufnehmen (es wird auch empfohlen, diese in jede Aktivity
in Ihrer App aufzunehmen).
1 |
<?xml version="1.0" encoding="utf-8"?>
|
2 |
<menu xmlns:android="https://schemas.android.com/apk/res/android" |
3 |
xmlns:app="http://schemas.android.com/apk/res-auto"> |
4 |
<item
|
5 |
android:id="@+id/media_route_menu_item" |
6 |
android:title="Cast" |
7 |
app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider" |
8 |
app:showAsAction="always" /> |
9 |
</menu>
|
Als Nächstes müssen Sie dieses neue MenuItem
in der onCreateOptionsMenu
-Methode Ihrer Aktivity
initialisieren.
1 |
@Override public boolean onCreateOptionsMenu(Menu menu) { |
2 |
super.onCreateOptionsMenu(menu); |
3 |
getMenuInflater().inflate(R.menu.menu_main, menu); |
4 |
mMediaRouterButton = CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), |
5 |
menu, |
6 |
R.id.media_route_menu_item); |
7 |
|
8 |
return true; |
9 |
}
|
Sobald Ihre Schaltfläche für die Medienroute initialisiert ist, möchten Sie Ihrer Anwendung Status-Listener zum Casting hinzufügen.
Verfügbare Listener
Während mehrere Listener verfügbar sind, gibt es drei, die es wert sind, besprochen zu werden, wenn Sie mit der Verwendung des Google Cast-Frameworks beginnen.
-
CastStateListener
: Dieser Listener überwacht den aktuellen Casting-Status einer App. Es wird ausgelöst, wenn die App aufCONNECTING
,CONNECTED
,NOT_CONNECTED
oderNO_DEVICES_AVAILABLE
umgeschaltet hat. -
AppVisibilityListener
: Dieser Listener verfügt über zwei Methoden:onAppEnteredForeground
undonAppEnteredBackground
. 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 Listener, über den wir sprechen werden, ist auch der ausführlichste. EineSession
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 verwaltet wird und endet, wenn der Benutzer die Verbindung getrennt hat. Das Android-Framework von Google Cast interagiert mitSession
über dasSessionManager
-Objekt.
Diese drei Listener können wie folgt mit dem Google Cast-Framework verknüpft werden, wobei this
in diesem Beispiel die Aktivity
ist, die jede der oben genannten Schnittstellen implementiert hat.
1 |
CastContext.getSharedInstance(this).addCastStateListener(this); |
2 |
CastContext.getSharedInstance(this).addAppVisibilityListener(this); |
3 |
CastContext.getSharedInstance(this).getSessionManager().addSessionManagerListener(this); |
Möglicherweise haben Sie auch bemerkt, dass Sie mit CastContext.getSharedInstance(Context)
auf das SessionManager
- und Cast-Framework zugreifen. Dies liegt daran, dass der CastContext
, der Hauptinteraktionspunkt zwischen Ihrer App und dem Cast-Framework, für eine verbesserte App-Leistung träge initialisiert wird.
Wenn Ihre Aktivity
nicht mehr aktiv ist, müssen Sie daran denken, diese Listener zu entfernen.
1 |
CastContext.getSharedInstance(this).removeAppVisibilityListener(this); |
2 |
CastContext.getSharedInstance(this).removeCastStateListener(this); |
3 |
CastContext.getSharedInstance(this).getSessionManager().removeSessionManagerListener(this); |
Erstellen eines OptionsProviders
Um etwas mit dem Cast-Framework zu tun, müssen Sie eine neue Klasse erstellen, die OptionsProvider
erweitert. In dieser Klasse können Sie verschiedene Optionen für Ihre Absender-App konfigurieren.
Wir werden dies vorerst einfach halten und einfach ein CastOptions
-Objekt von der getCastOptions
-Methode zurückgeben, mit dem gespeicherte Sitzungen fortgesetzt und die Verbindung zu bereits laufenden Sitzungen wiederhergestellt werden kann (obwohl beide bereits standardmäßig aktiviert sind, werden sie hier als bereitgestellt Beispiele).
Im CastOptions
-Objekt ist auch Ihre Empfänger-App-ID Ihrem Absender zugeordnet. Obwohl die Methode getAdditionalSessionProviders
in dieser Klasse deklariert werden muss, können wir sie für unsere Zwecke ignorieren.
1 |
public class CastOptionsProvider implements OptionsProvider { |
2 |
@Override
|
3 |
public CastOptions getCastOptions(Context context) { |
4 |
|
5 |
CastOptions castOptions = new CastOptions.Builder() |
6 |
.setResumeSavedSession(true) |
7 |
.setEnableReconnectionService(true) |
8 |
.setReceiverApplicationId(context.getString(R.string.cast_app_id)) |
9 |
.build(); |
10 |
|
11 |
return castOptions; |
12 |
}
|
13 |
|
14 |
@Override
|
15 |
public List<SessionProvider> getAdditionalSessionProviders(Context context) { |
16 |
return null; |
17 |
}
|
18 |
}
|
Sie müssen diese Klasse auch in Ihre AndroidManifest.xml-Datei in einem meta-data
-Tag unter Ihrem application
-Knoten aufnehmen.
1 |
<meta-data
|
2 |
android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME" |
3 |
android:value="com.tutsplus.googlecastv3.CastOptionsProvider" /> |
Zu diesem Zeitpunkt sollte Ihre Anwendung in der Lage sein, Casting-Geräte auf der weißen Liste zu finden und über Ihre Anwendung eine Verbindung zu ihnen herzustellen.



Routing-Dialog-Styling
Abhängig von dem Thema, das Sie in Ihrer App verwenden (z. B. Theme.AppCompat.Light.NoActionBar
), haben Sie möglicherweise einige seltsame Verhaltensweisen mit Farben im Dialogfeld des Casting-Geräts festgestellt, z. B. weiße Schrift und Symbole auf weißem Hintergrund.



Sie können auch festlegen, dass das Dialogfeld an Ihre Anwendung angepasst werden soll. Sie können dies tun, indem Sie die beiden für das Dialogfeld "Besetzung" verwendeten Stile überschreiben: Theme.MediaRouter.Light.DarkControlPanel
und Theme.MediaRouter.LightControlPanel
. Wenn Sie beispielsweise auf weiße Schrift auf weißem Hintergrund stoßen, können Sie den folgenden Code in Ihre Datei styles.xml aufnehmen, um die Symbole und die Schriftfarbe so zu ändern, dass sie auf weißem Hintergrund schwarz sind.
1 |
<style name="Theme.MediaRouter.Light.DarkControlPanel"> |
2 |
<item name="mediaRoutePlayDrawable">@drawable/mr_ic_play_light</item> |
3 |
<item name="mediaRoutePauseDrawable">@drawable/mr_ic_pause_light</item> |
4 |
<item name="mediaRouteCastDrawable">@drawable/mr_ic_cast_dark</item> |
5 |
<item name="mediaRouteAudioTrackDrawable">@drawable/ic_audiotrack_light</item> |
6 |
<item name="mediaRouteControllerPrimaryTextStyle">@style/MediaRouteControllerTextColor</item> |
7 |
<item name="mediaRouteControllerSecondaryTextStyle">@style/MediaRouteControllerTextColor</item> |
8 |
</style>
|
9 |
|
10 |
<style name="MediaRouteControllerTextColor"> |
11 |
<item name="android:textColor">#000000</item> |
12 |
<item name="android:textSize">14sp</item> |
13 |
</style>
|
Casting von Inhalten
Sobald Sie eine Verbindung zu einem Casting-Gerät hergestellt haben, möchten Sie wahrscheinlich, dass Ihre Benutzer Inhalte darauf übertragen. Glücklicherweise macht das Cast SDK dies unglaublich einfach. In Ihrer App möchten Sie feststellen, ob Ihr Benutzer eine Verbindung zu einem Gerät hergestellt hat. Stellen Sie dazu sicher, dass SessionManager
eine aktuelle Session
und der aktuellen Session
ein RemoteMediaClient
-Objekt zugeordnet ist.
1 |
if( CastContext.getSharedInstance(this).getSessionManager().getCurrentCastSession() != null |
2 |
&& CastContext.getSharedInstance(this).getSessionManager().getCurrentCastSession().getRemoteMediaClient() != null ) { |
Sobald Sie wissen, dass die Anwendung einem RemoteMediaClient
zugeordnet ist, möchten Sie ein MediaInfo
-Objekt erstellen, das einen Link zu dem Remote-Inhalt enthält, den Sie abspielen möchten, sowie zu den Streaming- und Inhaltstypen für Ihre Medien. Wenn MediaInfo
erstellt und gefüllt wird, können Sie die Lademethode auf dem RemoteMediaClient
aufrufen, um mit dem Casting des Inhalts zu beginnen. Mit dem folgenden Code wird beispielsweise eine Videodatei auf den Fernseher übertragen.
1 |
RemoteMediaClient remoteMediaClient = CastContext.getSharedInstance(this).getSessionManager().getCurrentCastSession().getRemoteMediaClient(); |
2 |
|
3 |
MediaInfo mediaInfo = new MediaInfo.Builder(getString(R.string.movie_link)) |
4 |
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) |
5 |
.setContentType("videos/mp4") |
6 |
.build(); |
7 |
|
8 |
|
9 |
remoteMediaClient.load(mediaInfo, true, 0); |



Metadata
Die Empfänger- und UI-Komponenten im Cast SDK verwenden ein MediaMetadata
-Objekt zum Speichern und Referenzieren von Informationen zu den aktuell wiedergegebenen Medien. Sie können diesem Objekt mithilfe der von der Klasse bereitgestellten Schlüssel Werte hinzufügen und mithilfe der addImage
-Methode Bild-URLs hinzufügen.
1 |
MediaMetadata metadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE); |
2 |
|
3 |
metadata.putString(MediaMetadata.KEY_TITLE, "Title"); |
4 |
metadata.putString(MediaMetadata.KEY_SUBTITLE, "Subtitle"); |
5 |
metadata.addImage(new WebImage(Uri.parse(getString(R.string.movie_poster)))); |
Sobald das MediaMetadata
-Objekt erstellt wurde, können Sie es der MediaInfo
des Inhalts zuordnen.
1 |
MediaInfo mediaInfo = new MediaInfo.Builder(getString(R.string.movie_link)) |
2 |
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) |
3 |
.setContentType("videos/mp4") |
4 |
.setMetadata(metadata) |
5 |
.build(); |
UI-Komponenten
Das Cast SDK übernimmt zwar die Logik zum Verbinden und Casting von Inhalten mit dem Fernseher, bietet jedoch auch mehrere UI-Komponenten, mit denen Entwickler die Casting-UI-Designrichtlinien erfüllen können.
Einführungsüberlagerung
Wenn Ihr Nutzer Ihre Anwendung zum ersten Mal öffnet, wird empfohlen, dass Sie ihn darüber informieren, dass Sie Google Cast unterstützen. Sie können dies tun, indem Sie ein IntroductoryOverlay
einfügen, das die Cast-Schaltfläche hervorhebt, sobald sie zum ersten Mal verfügbar ist.
Um das IntroductoryOverlay
einzuschließen, müssen Sie es zunächst als Mitgliedsvariable oben in Ihrer Hauptaktivität hinzufügen.
1 |
private IntroductoryOverlay mIntroductoryOverlay; |
Sobald Sie ein gemeinsames Objekt für das Overlay haben, können Sie eine Methode erstellen, mit der überprüft wird, ob die Schaltfläche für den Medienrouter angezeigt wird, und ob das Overlay angezeigt wird.
Diese Komponente wird mithilfe eines einfachen Builder-Musters ausgearbeitet, das eine String
für den Text, eine Farbressourcen-ID und einige andere Anpassungsattribute akzeptiert. In den meisten Fällen sollten Sie auch sicherstellen, dass Sie setSingleTime()
aufrufen, damit das Overlay für den Benutzer immer nur einmal angezeigt wird.
1 |
private void showIntroductoryOverlay() { |
2 |
if (mIntroductoryOverlay != null) { |
3 |
mIntroductoryOverlay.remove(); |
4 |
}
|
5 |
if ((mMediaRouterButton != null) && mMediaRouterButton.isVisible()) { |
6 |
new Handler().post(new Runnable() { |
7 |
@Override
|
8 |
public void run() { |
9 |
mIntroductoryOverlay = new IntroductoryOverlay.Builder( |
10 |
MainActivity.this, mMediaRouterButton) |
11 |
.setTitleText("Introduction text") |
12 |
.setOverlayColor(R.color.colorPrimary) |
13 |
.setSingleTime() |
14 |
.setOnOverlayDismissedListener( |
15 |
new IntroductoryOverlay.OnOverlayDismissedListener() { |
16 |
@Override
|
17 |
public void onOverlayDismissed() { |
18 |
mIntroductoryOverlay = null; |
19 |
}
|
20 |
})
|
21 |
.build(); |
22 |
mIntroductoryOverlay.show(); |
23 |
}
|
24 |
});
|
25 |
}
|
26 |
}
|
Nachdem Sie eine Methode zum Anzeigen des Overlays erstellt haben, müssen Sie sie nur noch aufrufen. Es gibt zwei Punkte, an denen Sie diese Methode hinzufügen sollten: in onCreateOptionsMenu
und in onCastStateChanged
von Ihrem CastStateListener
, wenn der Status nicht NO_DEVICES_AVAILABLE
ist. Dies behandelt beide Eventualitäten, wenn die Routing-Schaltfläche angezeigt werden könnte.
1 |
@Override
|
2 |
public void onCastStateChanged(int newState) { |
3 |
if (newState != CastState.NO_DEVICES_AVAILABLE) { |
4 |
showIntroductoryOverlay(); |
5 |
}
|
6 |
}
|
7 |
|
8 |
@Override
|
9 |
public boolean onCreateOptionsMenu(Menu menu) { |
10 |
super.onCreateOptionsMenu(menu); |
11 |
getMenuInflater().inflate(R.menu.menu_main, menu); |
12 |
mMediaRouterButton = CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), |
13 |
menu, |
14 |
R.id.media_route_menu_item); |
15 |
|
16 |
showIntroductoryOverlay(); |
17 |
|
18 |
return true; |
19 |
}
|
Zu diesem Zeitpunkt sollten Sie in der Lage sein, Ihre App zu starten und die Überlagerung anzuzeigen, 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.



Erweiterte Steuerelemente
Während des Castings möchten Sie in der Lage sein, ein einfaches UI-Widget zur Steuerung von Inhalten auf dem Fernseher des Benutzers bereitzustellen. Google hat dies durch die Bereitstellung der ExpandedControllerActivity
-Klasse im Cast SDK vereinfacht.
Erstellen Sie dazu eine neue Java-Klasse und erweitern Sie ExpandedControllerActivity
. In diesem Tutorial wird eine mit dem Namen ExpandedControlsActivity
erstellt. Sobald Ihre Aktivität erstellt wurde, aktualisieren Sie onCreateOptionsMenu
, um die Schaltfläche für das Casting-Routing in die Symbolleiste aufzunehmen.
1 |
public class ExpandedControlsActivity extends ExpandedControllerActivity { |
2 |
|
3 |
@Override
|
4 |
public boolean onCreateOptionsMenu(Menu menu) { |
5 |
super.onCreateOptionsMenu(menu); |
6 |
getMenuInflater().inflate(R.menu.menu_main, menu); |
7 |
CastButtonFactory.setUpMediaRouteButton(this, menu, R.id.media_route_menu_item); |
8 |
return true; |
9 |
}
|
10 |
}
|
Öffnen Sie als Nächstes Ihre OptionsProvider
-Klasse. Sie sollten in die getCastOptions
-Methode gehen und ein CastMediaOptions
-Objekt erstellen, das mit Ihrer ExpandedControllerActivity
verknüpft ist. Sobald Ihr CastMediaOptions
-Objekt erstellt wurde, können Sie es dem CastOptions
-Element zuordnen, das von der Methode zurückgegeben wird.
1 |
CastMediaOptions mediaOptions = new CastMediaOptions.Builder() |
2 |
.setExpandedControllerActivityClassName(ExpandedControlsActivity.class.getName()) |
3 |
.build(); |
4 |
|
5 |
CastOptions castOptions = new CastOptions.Builder() |
6 |
.setResumeSavedSession(true) |
7 |
.setEnableReconnectionService(true) |
8 |
.setReceiverApplicationId(context.getString(R.string.cast_app_id)) |
9 |
.setCastMediaOptions(mediaOptions) |
10 |
.build(); |
11 |
|
12 |
return castOptions; |
Um eine funktionierende ExpandedControllerActivity
zu erhalten, müssen Sie sie wie folgt in AndroidManifest.xml aufnehmen.
1 |
<activity
|
2 |
android:name=".ExpandedControlsActivity" |
3 |
android:label="@string/app_name" |
4 |
android:theme="@style/ExpandedCastControlsStyle" |
5 |
android:launchMode="singleTask" |
6 |
android:screenOrientation="portrait"> |
7 |
<intent-filter>
|
8 |
<action android:name="android.intent.action.MAIN"/> |
9 |
</intent-filter>
|
10 |
<meta-data
|
11 |
android:name="android.support.PARENT_ACTIVITY" |
12 |
android:value=".MainActivity"/> |
13 |
</activity>
|
Sie sollten beachten, dass für den aktivity
-Knoten eine theme
-Eigenschaft festgelegt ist. Dieser Stil wird verwendet, um optional die ExpandedControllerActivity
und die angezeigten Schaltflächen anzupassen.
Der Controller besteht aus vier anpassbaren Tastenfeldern mit einem Wiedergabe- / Pausenschalter in der Mitte. Mithilfe eines neuen Stils und einer Array-Ressource können Sie anpassen, welche Schaltflächen angezeigt werden. In arrays.xml habe ich ein neues array
hinzugefügt, das Steckplatz 1 auf leer setzt, Steckplatz 2 auf die 30-Sekunden-Rückspultaste, Steckplatz 3 (erstes Element rechts neben dem Wiedergabe-/Pausenschalter), um 30 Sekunden vorzuspulen, und Der letzte Slot, an dem ein Stummschalten ausgeführt wird.
1 |
<?xml version="1.0" encoding="utf-8"?>
|
2 |
<resources>
|
3 |
<array name="cast_expanded_controller_control_buttons"> |
4 |
<item>@id/cast_button_type_empty</item> |
5 |
<item>@id/cast_button_type_rewind_30_seconds</item> |
6 |
<item>@id/cast_button_type_forward_30_seconds</item> |
7 |
<item>@id/cast_button_type_mute_toggle</item> |
8 |
</array>
|
9 |
</resources>
|
Sie können dieses array
dann Ihrer Aktivity
zuordnen, indem Sie Ihre neue style
-Ressource erstellen und den Wert castExpandedControllerStyle
mit einem neuen style
überschreiben, der CastExpandedController
erweitert.
1 |
<style name="ExpandedCastControlsStyle" parent="Theme.AppCompat.NoActionBar"> |
2 |
<item name="castExpandedControllerStyle">@style/CustomCastExpandedController</item> |
3 |
</style>
|
4 |
|
5 |
<style name="CustomCastExpandedController" parent="CastExpandedController"> |
6 |
<item name="castControlButtons">@array/cast_expanded_controller_control_buttons</item> |
7 |
</style>
|
Zu diesem Zeitpunkt sollten Sie in der Lage sein, auf das Bild in Ihrem Router-Dialogfeld für gegossene Medien zu klicken, um Ihre neue Controller-Aktivity
zu öffnen, oder es selbst in Ihrer Anwendung mit einem einfachen startActivity
-Aufruf zu starten.
1 |
startActivity(new Intent(this, ExpandedControlsActivity.class)); |



Steuerelemente für Benachrichtigung/Sperrbildschirm
Wenn ein Benutzer Inhalte auf seinen Fernseher überträgt, besteht eine gute Chance, dass er Ihre App nicht im Vordergrund hält oder sein Telefon entsperrt. 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-Geräte und höher nicht im Vordergrund steht. Das Cast SDK übernimmt die Erstellung eines RemoteControlClient
-Sperrbildschirms für KitKat und frühere Geräte.
Das Hinzufügen von Steuerelementen für Benachrichtigungs-/Sperrbildschirme ist recht einfach, da alles in der Methode getCastOptions
Ihres OptionsProviders
(CastOptionsProvider.java für dieses Tutorial) behandelt wird.
Zunächst müssen Sie eine ArrayList
mit Zeichenfolgen erstellen, die die Schaltflächen enthält, die Sie für Ihre Steuerelemente benötigen. Als Nächstes können Sie ein int
-Array erstellen, das die Indizes der Schaltflächen enthält, die angezeigt werden sollen, wenn sich die Benachrichtigung im kompakten Modus befindet.
Sobald Sie Ihre beiden Arrays erstellt haben, erstellen Sie ein NotificationOptions
-Objekt, das die Aktionen an die neue Benachrichtigung bindet, und weisen eine Aktivity
zu, die geöffnet werden soll, wenn die Benachrichtigung ausgewählt wird. In diesem Beispiel verwenden wir einfach die ExpandedControlsActivity
, die wir im letzten Abschnitt erstellt haben.
Schließlich können Sie die Benachrichtigung zu Ihren CastMediaOptions
hinzufügen.
1 |
List<String> buttonActions = new ArrayList<>(); |
2 |
|
3 |
buttonActions.add(MediaIntentReceiver.ACTION_TOGGLE_PLAYBACK); |
4 |
buttonActions.add(MediaIntentReceiver.ACTION_STOP_CASTING); |
5 |
|
6 |
int[] compatButtonActionsIndicies = new int[]{ 0, 1 }; |
7 |
|
8 |
NotificationOptions notificationOptions = new NotificationOptions.Builder() |
9 |
.setActions(buttonActions, compatButtonActionsIndicies) |
10 |
.setTargetActivityClassName(ExpandedControlsActivity.class.getName()) |
11 |
.build(); |
12 |
|
13 |
CastMediaOptions mediaOptions = new CastMediaOptions.Builder() |
14 |
.setNotificationOptions(notificationOptions) |
15 |
.setExpandedControllerActivityClassName(ExpandedControlsActivity.class.getName()) |
16 |
.build(); |
Wenn Ihre Benutzer nun Inhalte auf ihre Fernseher übertragen und den Bildschirm sperren oder von Ihrer App weg navigieren, wird eine Benachrichtigung angezeigt, mit der sie den Inhalt auf dem großen Bildschirm steuern können, während sie weiterhin mit ihrem Telefon interagieren. Wenn Sie außerhalb der Steuerelemente auf die Benachrichtigung klicken, wird Ihre App mit der ExpandedControlsActivity
wieder in den Vordergrund gerückt, sodass Ihre Benutzer ihre Anzeigeerfahrung genauer steuern können.



Mini-Controller
Das letzte UI-Widget, das Sie in diesem Tutorial kennenlernen, ist das MiniControllerFragment
. Dieses Element kann in Ihre Aktivitätslayoutdateien eingefügt werden. Wenn Ihre App Inhalte überträgt, wird es automatisch sichtbar und bietet Ihren Benutzern beim Durchsuchen Ihrer App einen leicht zugänglichen Controller. Obwohl dies die letzte Komponente ist, die wir diskutieren werden, ist sie bei weitem auch am einfachsten zu implementieren. Sie müssen es einfach so in Ihre Layoutdateien aufnehmen.
1 |
<fragment
|
2 |
android:id="@+id/castMiniController" |
3 |
android:layout_width="match_parent" |
4 |
android:layout_height="wrap_content" |
5 |
android:layout_alignParentBottom="true" |
6 |
android:visibility="gone" |
7 |
class="com.google.android.gms.cast.framework.media.widget.MiniControllerFragment" /> |
Wenn Sie außerhalb des Wiedergabe-/Pausenschalters auf dieses Element klicken, wird Ihre ExtendedControllerActivity
aufgerufen, sodass Ihre Benutzer leicht auf die Inhalte ihres Fernsehgeräts zugreifen können.



Abschluss
In diesem Tutorial haben Sie viel über das neue Google Cast SDK für Android, die darin enthaltenen UI-Komponenten und das Erstellen einer grundlegenden Empfängeranwendung für das Casting gelernt. Was Sie hier behandelt haben, hilft Ihnen beim Erstellen der gängigsten Arten von Casting-Anwendungen. Google bietet jedoch auch Funktionen, mit denen Sie schnell Cast-fähige Spiele und benutzerdefinierte Empfängeranwendungen erstellen können.