Google Cast er en teknologi som gjør at brukere kan sende elektronisk innhold til en enhet, for eksempel en Chromecast eller Android TV, koblet til en fjernsyn. Når innholdet er tilgjengelig på fjernsynet, kan brukerne kontrollere det fra mobilenheten eller datamaskinen.
I denne opplæringen lærer du hvordan du lager et grunnleggende Cast-aktivert program for Android ved hjelp av Cast SDK v3, som ble annonsert under 2016 Google I / O-konferansen.
Google Cast er bygget opp rundt to komponenter: mottakeren, som egentlig er en nettside som vises på en avstøpningsenhet med innholdet ditt, og avsenderen, som er klientprogrammet som ber om media og styrer avspilling.
Før du kan opprette avsenderprogrammet ditt, må du registrere en konto i Google Cast-utviklerkonsollen, og deretter opprette og konfigurere et nytt mottakerprogram. For å registrere en konto må du betale engangsavgift på $ 5. Når kontoen din er opprettet, kan du klikke på den røde Legg til ny søknad knappen for å lage et nytt mottakerprogram.
Deretter har du tre alternativer: Egendefinert mottaker, Styled Media Receiver og Remote Display Receiver. For enkelhet, i denne opplæringen vil du bruke en Styled Media Receiver.
På neste skjermbilde kan du velge noen grunnleggende innstillinger for mottakeren, for eksempel programnavnet, en valgfri URL for et CSS-stilark for å tilpasse mottakerens utseende og muligheten til å aktivere gjestemodus og lyd- bare støping.
Når du slår den blå Lagre knappen, vil du bli presentert med en skjerm som viser de grunnleggende detaljene i den nye mottakeren din. Du vil legge merke til at denne skjermen også inneholder den nye Program-ID. Du må bruke denne verdien i Android-applikasjonen din.
Det er verdt å merke seg at selv om mottakerappen din er opprettet, kan det ta noen timer å bli oppdaget av avsenderprogrammet ditt.
For å teste, må du ha hvitliste minst en avstøpningsenhet. Du kan gjøre dette fra Google Cast Developer Console ved å klikke på den røde Legg til NYTT ENHET knapp. På skjermen som kommer opp, kan du skrive inn enhetens serienummer og en beskrivelse for å hvitliste den for testing med mottakerprogrammet ditt.
På dette tidspunktet bør du ha en mottaker opprettet og en testenhet på hvitlisten, så du er helt klar til å begynne å bygge en Android-senderapp. Når du har opprettet og publisert søknaden din i Play-butikken, vil du gå tilbake til Cast Developer Console for å publisere mottakeren din, slik at en hvilken som helst avstøpningsenhet kan brukes sammen med avsenderappen din.
Det første du må gjøre i Android-appen din, er blant annet bibliotekene for Cast Framework og Media Router under avhengig
node i din build.gradle fil.
kompilere 'com.android.support:mediarouter-v7:24.1.1' compile 'com.google.android.gms: play-services-cast-framework: 9.4.0'
Deretter vil du ønske å lagre søknads-IDen du fikk når du oppretter mottakeren din i din strings.xml fil.
(din ID går her)
Det siste trinnet i installasjonsprosessen er å inkludere Internett-tillatelsen for søknaden din. Åpen AndroidManifest.xml og ta med følgende linje før din applikasjon
node.
Nå som oppsettet ditt er gjort, kan du fortsette å inkludere media ruteknappen i søknaden din.
Ruteknappen er ikonet i et programmets verktøylinje som vanligvis betyr at en app støtter casting for brukeren.
For å få denne knappen til å vises i søknaden din verktøylinje
, Den enkleste måten er å inkludere den i menyen XML-filen for din Aktivitet
(det anbefales også at dette går inn i hver Aktivitet
i appen din).
Deretter må du initialisere denne nye MENUITEM
i onCreateOptionsMenu
metode for din Aktivitet
.
@Override public boolean onCreateOptionsMenu (Menymeny) super.onCreateOptionsMenu (meny); getMenuInflater (). oppblås (R.meny.menu_main, meny); mMediaRouterButton = CastButtonFactory.setUpMediaRouteButton (getApplicationContext (), meny, R.id.media_route_menu_item); returnere sant;
Når media ruteknappen er initialisert, vil du legge til statslyttere i søknaden din for avstøpning.
Mens det er flere lyttere tilgjengelig, er det tre verdier å diskutere når du begynner å bruke Google Cast-rammeverket.
CastStateListener
: Denne lytteren overvåker gjeldende støpestatus for en app. Det utløses når appen har byttet til KOBLER TIL
, TILKOBLET
, IKKE TILKOBLET
, eller NO_DEVICES_AVAILABLE
. AppVisibilityListener
: Denne lytteren har to metoder: onAppEnteredForeground
og onAppEnteredBackground
. Disse metodene kalles når appen din har blitt bakket opp av brukeren din, eller når brukeren har gjenåpnet søknaden din, henholdsvis.SessionManagerListener
: Den endelige lytteren vi skal gå over er også den mest verbose. EN Økt
er livssyklusen til brukerinteraksjon med en avstøpningsenhet, som starter når brukeren har koblet til en enhet, opprettholdes ved støping, og slutter når brukeren har koblet fra. Google Cast Android-rammeverket samhandler med Økt
gjennom SessionManager
gjenstand.Disse tre lytterne kan være knyttet til Google Cast-rammeverket som det, hvor dette
i dette eksemplet er Aktivitet
som har implementert hver av de ovennevnte grensesnittene.
CastContext.getSharedInstance (dette) .addCastStateListener (this); CastContext.getSharedInstance (dette) .addAppVisibilityListener (this); . CastContext.getSharedInstance (dette) .getSessionManager () addSessionManagerListener (this);
Du har kanskje også lagt merke til at du får tilgang til SessionManager
og Cast ramme ved hjelp av CastContext.getSharedInstance (Context)
. Dette skyldes at CastContext
, Det viktigste samspillingspunktet mellom appen din og Cast-rammen, startes lurt for forbedret appytelse.
Når din Aktivitet
er ikke lenger aktiv, må du huske å fjerne disse lytterne.
CastContext.getSharedInstance (dette) .removeAppVisibilityListener (this); CastContext.getSharedInstance (dette) .removeCastStateListener (this); . CastContext.getSharedInstance (dette) .getSessionManager () removeSessionManagerListener (this);
OptionsProvider
For å gjøre noe med Cast-rammen, må du opprette en ny klasse som strekker seg OptionsProvider
. Denne klassen vil være der du kan konfigurere ulike alternativer for avsenderappen din.
Vi vil holde dette enkelt for nå og bare returnere a CastOptions
objekt fra getCastOptions
metode som gjør det mulig å gjenoppta lagrede økter og koble seg til økter som allerede er i gang (selv om begge disse allerede er aktivert som standard, er de gitt her som eksempler).
De CastOptions
Objektet er også hvor mottakerens app-ID er knyttet til avsenderen. Selv om metoden getAdditionalSessionProviders
må deklareres i denne klassen, kan vi sikkert ignorere det for våre formål.
offentlig klasse CastOptionsProvider implementerer OptionsProvider @Override public CastOptions getCastOptions (Kontekst kontekst) CastOptions castOptions = ny CastOptions.Builder () .setResumeSavedSession (true) .setEnableReconnectionService (true) .setReceiverApplicationId (context.getString (R.string.cast_app_id)). bygge(); returnere castOptions; Overstyr offentlig listegetAdditionalSessionProviders (Kontekst kontekst) return null;
Du må også inkludere denne klassen i din AndroidManifest.xml filen i en meta-dataene
tag under din applikasjon
node.
På dette tidspunktet bør søknaden din finne noen hvitlistede støpeinnretninger og koble til dem gjennom søknaden din.
Avhengig av temaet du bruker i appen din (for eksempel Theme.AppCompat.Light.NoActionBar
), kan du ha lagt merke til noen rare oppføringer med farger i dialogboksen avstøpningsenhet, for eksempel hvit skrift og ikoner på en hvit bakgrunn.
Du kan også bestemme at du vil tilpasse hvordan dialogboksen ser ut til å passe sammen med søknaden din. Du kan gjøre dette ved å overstyre de to stilene som brukes til Cast-dialogen: Theme.MediaRouter.Light.DarkControlPanel
og Theme.MediaRouter.LightControlPanel
. Hvis du for eksempel kjører inn i hvit skrift på en hvit bakgrunn, kan du inkludere følgende kode i din styles.xml fil for å endre ikonene og skriftfargen for å være svart på den hvite bakgrunnen.
Når du har koblet til en avstøpningsenhet, vil du sannsynligvis la brukerne gi innhold til det. Heldigvis gjør Cast SDK dette utrolig enkelt å gjøre. I appen din vil du finne ut om brukeren din har koblet til en enhet, som kan gjøres ved å sørge for at SessionManager
har en strøm Økt
og at den nåværende Økt
har en RemoteMediaClient
objekt knyttet til det.
hvis (CastContext.getSharedInstance (this) .getSessionManager (). getCurrentCastSession ()! = null && CastContext.getSharedInstance (this) .getSessionManager (). getCurrentCastSession (). getRemoteMediaClient ()! = null)
Når du vet at søknaden er knyttet til a RemoteMediaClient
, du vil opprette en Mediainfo
objekt som inneholder en lenke til fjerninnholdet du vil spille, samt streaming og innholdstyper for mediet ditt. Når Mediainfo
er opprettet og befolket, kan du ringe belastningsmetoden på RemoteMediaClient
å begynne å kaste innholdet. For eksempel vil den følgende koden kaste en videofil til fjernsynet.
RemoteMediaClient remoteMediaClient = CastContext.getSharedInstance (this) .getSessionManager (). GetCurrentCastSession (). GetRemoteMediaClient (); MediaInfo mediaInfo = ny MediaInfo.Builder (getString (R.string.movie_link)) .setStreamType (MediaInfo.STREAM_TYPE_BUFFERED) .setContentType ("videos / mp4") .build (); remoteMediaClient.load (mediaInfo, true, 0);
Mottaker- og brukergrensesnittkomponenter i Cast SDK bruker a MediaMetadata
objekt for lagring og referanseinformasjon om media som spilles for øyeblikket. Du kan legge til verdier for dette objektet ved hjelp av nøklene som tilbys av klassen, og du kan legge til bildeadresser ved hjelp av Legg til bilde
metode.
MediaMetadata metadata = ny MediaMetadata (MediaMetadata.MEDIA_TYPE_MOVIE); metadata.putString (MediaMetadata.KEY_TITLE, "Tittel"); metadata.putString (MediaMetadata.KEY_SUBTITLE, "Teksting"); metadata.addImage (ny WebImage (Uri.parse (getString (R.string.movie_poster))));
Først når MediaMetadata
objekt er opprettet, du kan knytte det til innholdet Mediainfo
.
MediaInfo mediaInfo = ny MediaInfo.Builder (getString (R.string.movie_link)) .setStreamType (MediaInfo.STREAM_TYPE_BUFFERED) .setContentType ("videos / mp4") .setMetadata (metadata) .build ();
Mens Cast SDK håndterer logikken for tilkobling og støping av innhold til fjernsynet, inneholder den også flere brukergrensesnittkomponenter som hjelper utviklere til å oppfylle retningslinjene for Casting UI-design.
Når brukeren først åpner søknaden din, anbefales det at du forteller dem at du støtter Google Cast. Du kan gjøre dette ved å inkludere en IntroductoryOverlay
, som vil markere cast-knappen som den blir tilgjengelig for første gang.
Å inkludere IntroductoryOverlay
, Det første du vil gjøre er å legge det til som en variabel på toppen av hovedaktiviteten din.
privat innledendeOverlay mInntroductoryOverlay;
Når du har et felles objekt for overlegget, kan du opprette en metode som vil sjekke for å se om medietrouterknappen er vist, og hvis det vises, viser overlegget.
Denne komponenten er fleshed ut ved hjelp av et enkelt byggemønster som vil akseptere en string
for teksten, en farge ressurs-ID, og noen andre tilpasningsattributter. Oftere enn ikke, vil du også være sikker på at du ringer setSingleTime ()
, slik at overlegget bare blir vist en gang for brukeren.
privat tomt showIntroductoryOverlay () if (mInntroductoryOverlay! = null) mInntroductoryOverlay.remove (); Hvis ((mMediaRouterButton! = null) && mMediaRouterButton.isVisible ()) ny Handler (). post (ny Runnable () @Override public void run () mInntroductoryOverlay = ny IntroductoryOverlay.Builder (MainActivity.this, mMediaRouterButton) .setTitleText ("Introduksjonstekst") .setOverlayColor (R.color.colorPrimary) .setSingleTime () .setOnOverlayDismissedListener (ny innledendeOverlay.OnOverlayDismissedListener () @Override public void onOverlayDismissed () mInntroductoryOverlay = null;) .build () ; mInntroductoryOverlay.show (););
Nå som du har en metode laget for å vise overlegget, må du bare ringe det. Det er to poeng hvor du bør legge til denne metoden: i onCreateOptionsMenu
, og i onCastStateChanged
fra din CastStateListener
når staten ikke er det NO_DEVICES_AVAILABLE
. Dette vil håndtere begge forutsetninger når ruteknappen kan vises.
@Override public void onCastStateChanged (int newState) if (newState! = CastState.NO_DEVICES_AVAILABLE) showIntroductoryOverlay (); @Override public boolean onCreateOptionsMenu (Menymeny) super.onCreateOptionsMenu (meny); getMenuInflater (). oppblås (R.meny.menu_main, meny); mMediaRouterButton = CastButtonFactory.setUpMediaRouteButton (getApplicationContext (), meny, R.id.media_route_menu_item); showIntroductoryOverlay (); returnere sant;
På dette tidspunktet bør du kunne starte appen din og se overlegget, som vist i neste figur. Hvis du trenger å se det igjen for test, kan du tømme programmets data og gjenopprette.
Under avstøpning vil du være i stand til å gi en enkel brukergrensesnitt for å kontrollere innholdet på brukerens fjernsyn. Google har gjort det enkelt ved å tilby ExpandedControllerActivity
klasse i Cast SDK.
For å bruke dette, opprett en ny Java-klasse og utvide ExpandedControllerActivity
. Denne opplæringen vil opprette en kalt ExpandedControlsActivity
. Når aktiviteten din er opprettet, oppdater onCreateOptionsMenu
å inkludere stikkruteknappen i verktøylinjen.
offentlig klasse ExpandedControlsActivity utvider utvidetControllerActivity @Override public boolean onCreateOptionsMenu (Menymeny) super.onCreateOptionsMenu (meny); getMenuInflater (). oppblås (R.meny.menu_main, meny); CastButtonFactory.setUpMediaRouteButton (dette, menyen, R.id.media_route_menu_item); returnere sant;
Deretter åpner du OptionsProvider
klasse. Du vil ønske å gå inn i getCastOptions
metode og opprett en CastMediaOptions
objekt som knytter seg til din ExpandedControllerActivity
. En gang din CastMediaOptions
objekt er opprettet, du kan knytte det til CastOptions
element som returneres av metoden.
CastMediaOptions mediaOptions = ny CastMediaOptions.Builder () .setExpandedControllerActivityClassName (ExpandedControlsActivity.class.getName ()) .build (); CastOptions castOptions = ny CastOptions.Builder () .setResumeSavedSession (true) .setEnableReconnectionService (true) .setReceiverApplicationId (context.getString (R.string.cast_app_id)) .setCastMediaOptions (mediaOptions) .build (); returnere castOptions;
Til slutt, for å få en jobbing ExpandedControllerActivity
, du må inkludere den i AndroidManifest.xml, som så.
Du bør legge merke til at aktivitet
node har a tema
eiendomssett. Denne stilen brukes til å tilpasse ExpandedControllerActivity
og knappene som vises.
Kontrolleren består av fire tilpassbare knappspor, med en pause / pause veksle i midten. Ved hjelp av en ny stil og en ressursressurser kan du tilpasse hvilke knapper som vises. I arrays.xml, Jeg har lagt til en ny matrise
som setter spor 1 til tomt, spor 2 til 30 sekunders tilbakespolingsknapp, spalte 3 (første element til høyre for avspillings / pause veksle) for å spole fremover 30 sekunder, og det siste sporet for å være vert for en lydløs veksle.
- @ 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
Du kan deretter knytte dette til matrise
med din Aktivitet
ved å lage din nye stil
ressurs og overstyring av castExpandedControllerStyle
verdi med en ny stil
som strekker seg CastExpandedController
.
På dette tidspunktet bør du kunne klikke på bildet i ruterdialogen for støpt medie for å åpne den nye kontrolleren Aktivitet
, eller starte det selv fra din søknad med en enkel startActivity
anrop.
startActivity (new Intent (this, ExpandedControlsActivity.class));
Når en bruker kaster innhold til sin TV, er det en god sjanse for at de ikke vil holde appen din i forgrunnen eller telefonen låst opp. Når de navigerer bort fra appen din, vil du ha en enkel måte for dem å kontrollere innholdet i appen din. Du kan gjøre dette ved å legge til et varsel på appen din når den ikke er i forgrunnen for Lollipop og over enheter, og Cast SDK vil håndtere å opprette en låseskjerm RemoteControlClient
for KitKat og tidligere enheter.
Legge til varslings- / låseskjermkontroller er ganske grei, da det hele håndteres i getCastOptions
metode for din OptionsProvider
(CastOptionsProvider.java for denne opplæringen).
Først må du opprette en Arraylist
av strenger som vil inneholde knappene du vil ha for kontrollene dine. Deretter kan du opprette en int
array som vil inneholde indeksene til knappene du vil vise når meldingen er i kompakt modus.
Når du har opprettet dine to arrays, vil du opprette en NotificationOptions
objekt som binder handlingene til det nye varselet og tildeler en Aktivitet
å bli åpnet når varselet er valgt. For dette eksempelet vil vi ganske enkelt bruke ExpandedControlsActivity
som vi opprettet i den siste delen.
Til slutt kan du legge til varselet til din CastMediaOptions
.
ListebuttonActions = new ArrayList <> (); buttonActions.add (MediaIntentReceiver.ACTION_TOGGLE_PLAYBACK); buttonActions.add (MediaIntentReceiver.ACTION_STOP_CASTING); int [] kompatButtonActionsIndicies = new int [] 0, 1; NotificationOptions notificationOptions = new NotificationOptions.Builder () .setActions (buttonActions, compatButtonActionsIndicies) .setTargetActivityClassName (ExpandedControlsActivity.class.getName ()) .build (); CastMediaOptions mediaOptions = ny CastMediaOptions.Builder () .setNotificationOptions (notificationOptions) .setExpandedControllerActivityClassName (ExpandedControlsActivity.class.getName ()) .build ();
Nå, når brukerne støter innhold til sine fjernsyn og låser skjermen eller navigerer bort fra appen din, vises et varsel som gjør at de kan kontrollere innholdet på den store skjermen mens de fortsetter å samhandle med telefonen. Hvis du klikker på varselet utenfor kontrollene, kommer appen din tilbake til forkant med ExpandedControlsActivity
, gi brukerne mer finkornet kontroll over deres seeropplevelse.
Den siste brukergrensesnittet du vil lære om i denne opplæringen er MiniControllerFragment
. Dette elementet kan plasseres i dine aktivitetslayoutfiler, og når appen din støper innhold, blir den automatisk synlig og gir en lett tilgjengelig kontroller for brukerne mens de blar gjennom appen din. Selv om dette er den siste komponenten vi vil diskutere, er det også langt det enkleste å implementere. Du må bare inkludere den i layoutfilene dine, slik som det.
Når du klikker på dette elementet hvor som helst utenfor spill / pause veksle, din ExtendedControllerActivity
vil bli brakt opp, noe som gir brukerne lett tilgang til innholdet på deres fjernsyn.
I denne opplæringen har du lært mye om den nye Google Cast SDK for Android, brukergrensesnittkomponenter som leveres i den, og hvordan du lager et grunnleggende stilert mottakerprogram for støping. Det du har dekket her, vil hjelpe deg med å bygge de vanligste typene av casting-applikasjoner, selv om Google også gir funksjoner som lar deg raskt lage Cast-aktiverte spill og tilpassede mottakerprogrammer.