Google Play-tjenester Google Cast v3 og Media

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.

Cast konsolloppsett

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.

Android-oppsett

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.

Viser en ruteknapp og Koble til Cast-enheter

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 MENUITEMonCreateOptionsMenu 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.

Tilgjengelige lyttere

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);

Opprette en 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 liste getAdditionalSessionProviders (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.

Routing Dialog Styling

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.

 

Casting Content

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);

metadata

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 ();

UI-komponenter

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. 

Innledende overlegg

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.

Utvidede kontroller

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));

Notifikasjon / Låsskjermkontroller

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

Liste buttonActions = 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.

Mini Controller

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.

Konklusjon

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.