Servicii Google Play Google Cast v3 și Media

Google Cast este o tehnologie care permite utilizatorilor să trimită conținut online la un dispozitiv, cum ar fi un televizor Chromecast sau Android TV, conectat la un televizor. Odată ce conținutul este disponibil pe televizor, utilizatorii îl pot controla de pe dispozitivul mobil sau de pe computer. 

În acest tutorial, veți învăța cum să creați o aplicație de bază bazată pe Cast pentru Android utilizând aplicația SDK Cast v3, anunțată în timpul conferinței Google I / O din 2016.

Consola de instalare distribuită

Google Cast este construit în jurul a două componente: receptorul, care este în esență o pagină web afișată pe un dispozitiv de distribuție cu conținutul dvs. și expeditorul, care este programul client care solicită redarea media și controlează redarea. 

Înainte de a putea crea aplicația dvs. de expeditor, va trebui să vă înregistrați un cont în Consola pentru dezvoltatori Google Cast și apoi să creați și să configurați o nouă aplicație pentru destinatar. Pentru a vă înregistra un cont, va trebui să plătiți o taxă unică de 5 USD. Odată ce contul dvs. este creat, puteți face clic pe roșu ADĂUGARE NOI APLICAȚII pentru a crea o nouă aplicație a receptorului. 

Apoi, veți avea trei opțiuni: receptorul personalizat, receptorul media stilat și receptorul de afișare la distanță. Pentru simplitate, în acest tutorial veți folosi un Receiver de Medii Styled.

În ecranul următor, veți putea selecta câteva setări de bază pentru receptor, cum ar fi numele aplicației, o adresă URL opțională pentru o foaie de stil CSS pentru a particulariza aspectul receptorului și capacitatea de a activa modul de vizionare și modul audio- numai turnare. 

Odată ce ați lovit albastrul Salvați , veți fi prezentat cu un ecran care vă arată detaliile de bază ale noii dvs. aplicații pentru receptor. Veți observa că acest ecran conține și noul dvs. ID-ul aplicației. Va trebui să utilizați această valoare în aplicația Android.

Merită remarcat faptul că, chiar dacă aplicația dvs. pentru receptor este creată, este posibil să dureze câteva ore pentru a fi descoperită de către aplicația dvs. de expeditor. 

Pentru a testa, va trebui să listați cel puțin un dispozitiv de turnare. Puteți face acest lucru din Consola pentru dezvoltatori Google Cast făcând clic pe roșu ADĂUGAȚI DISPOZITIVUL NOU buton. Pe ecranul care apare, puteți introduce numărul de serie al dispozitivului dvs. și o descriere pe lista albă pentru a fi testată cu aplicația dvs. pentru receptor.

În acest moment, ar trebui să aveți un receptor creat și un dispozitiv de testare listat pe alb, deci sunteți pregătit să începeți să construiți o aplicație de expeditor Android. După ce ați creat și v-ați publicat aplicația în Magazinul Play, veți dori să reveniți la Consola pentru dezvoltatori difuzate pentru a vă publica receptorul, permițând utilizarea oricărui dispozitiv de distribuire cu aplicația dvs. pentru expeditor.

Instalare Android

Primul lucru pe care trebuie să-l faceți în aplicația dvs. Android este includerea bibliotecilor "Cadru de distribuție și Media Router" în cadrul dependențe în nodul tău build.gradle fişier.

compile 'com.android.support:mediarouter-v7:24.1.1' compilați 'com.google.android.gms: play-services-cast-framework: 9.4.0'

Apoi, veți dori să stocați ID-ul aplicației pe care ni l-ați dat când creați receptorul în telefonul dvs. strings.xml fişier.

(ID-ul dvs. merge aici)

Ultimul pas în procesul de instalare este includerea permisiunii de internet pentru aplicația dvs. Deschis AndroidManifest.xml și includeți următoarea linie înaintea dvs. cerere nodul.

Acum, când ați terminat configurarea, puteți trece la includerea butonului de rutare media din aplicația dvs..

Afișarea unui buton de redirecționare și conectarea la dispozitivele distribuite

Butonul de rutare este pictograma din bara de instrumente a unei aplicații, care înseamnă, în general, că o aplicație acceptă distribuirea pentru utilizator. 

Pentru ca acest buton să apară în aplicația dvs. Bara de instrumente, cea mai ușoară cale este să o includeți în meniul fișier XML pentru dvs. Activitate (de asemenea, este recomandat ca acest lucru să meargă în fiecare Activitate în aplicația dvs.).

   

Apoi, va trebui să inițializați acest nou Articol din meniu în onCreateOptionsMenu metoda dvs. Activitate

@Override public boolean onCreateOptionsMenu (Meniu meniu) super.onCreateOptionsMenu (meniu); getMenuInflater () se umflă (R.menu.menu_main, meniu); mMediaRouterButton = CastButtonFactory.setUpMediaRouteButton (getApplicationContext (), meniu, R.id.media_route_menu_item); return true; 

După ce ați inițializat butonul pentru ruta media, veți dori să adăugați ascultători de stat în aplicația dvs. pentru distribuire.

Ascultați ascultători

Deși există mai mulți ascultători disponibili, există trei discuții pe măsură ce începeți să utilizați cadrul Google Cast. 

  • CastStateListener: Acest ascultător monitorizează starea curentă de difuzare a unei aplicații. Este declanșată când aplicația a trecut la CONEXIUNI, CONECTAT, NU ESTE CONECTAT, sau NO_DEVICES_AVAILABLE
  • AppVisibilityListener: Acest ascultător are două metode: onAppEnteredForeground și onAppEnteredBackground. Aceste metode sunt numite atunci când aplicația dvs. a fost însoțită de utilizatorul dvs. sau când utilizatorul a redeschis aplicația dvs., respectiv.
  • SessionManagerListener: Ascultătorul final pe care îl vom trece este și cel mai verbos. A Sesiune este ciclul de viață al interacțiunii utilizatorilor cu un dispozitiv de distribuire, începând cu momentul în care utilizatorul are conectat la un dispozitiv, menținut prin turnare și terminând atunci când utilizatorul a deconectat. Cadrul Google Cast Android interacționează cu Sesiune prin SessionManager obiect.

Acești trei ascultători pot fi asociați cu cadrul Google Cast cum ar fi, unde acest în acest exemplu este Activitate care a implementat fiecare dintre interfețele de mai sus.

CastContext.getSharedInstance (aceasta) .addCastStateListener (aceasta); CastContext.getSharedInstance (aceasta) .addAppVisibilityListener (aceasta); . CastContext.getSharedInstance (aceasta) .getSessionManager () addSessionManagerListener (aceasta);

S-ar putea să fi observat, de asemenea, că accesați SessionManager și utilizarea cadrului folosind CastContext.getSharedInstance (Context). Acest lucru se datorează faptului că CastContext, principalul punct de interacțiune dintre aplicația dvs. și cadrul Cast, este inițializat în mod eronat pentru o performanță îmbunătățită a aplicațiilor. 

Când ești Activitate nu mai este activă, va trebui să vă amintiți să eliminați acești ascultători.

CastContext.getSharedInstance (aceasta) .removeAppVisibilityListener (aceasta); CastContext.getSharedInstance (aceasta) .removeCastStateListener (aceasta); . CastContext.getSharedInstance (aceasta) .getSessionManager () removeSessionManagerListener (aceasta);

Crearea unui OptionsProvider

Pentru a face ceva cu cadrul Cast, va trebui să creați o nouă clasă care să se extindă OptionsProvider. Această clasă va fi locul unde puteți configura diverse opțiuni pentru aplicația dvs. pentru expeditori. 

O să păstrăm acest lucru simplu pentru moment și să ne întoarcem a CastOptions obiect de la getCastOptions , care va permite reluarea sesiunilor salvate și reconectarea la sesiunile care sunt deja în desfășurare (deși ambele sunt deja activate în mod implicit, acestea sunt furnizate aici ca exemple). 

 CastOptions obiect este, de asemenea, în cazul în care ID-ul aplicației dvs. de destinatar este asociat cu expeditorul dvs. Deși metoda getAdditionalSessionProviders trebuie să fie declarate în această clasă, putem să o ignorăm în siguranță în scopurile noastre.

clasa publică CastOptionsProvider pune în aplicare OptionsProvider @Override public CastOptions getCastOptions (Context context) CastOptions castOptions = nou CastOptions.Builder () .setResumeSavedSession (adevărat) .setEnableReconnectionService (true) .setReceiverApplicationId (context.getString (R.string.cast_app_id)). construi(); returnOptions;  @Override public List getAdditionalSessionProviders (Context context) return null; 

Va trebui, de asemenea, să includeți această clasă în dvs. AndroidManifest.xml fișier în cadrul unui meta-date etichetă sub dvs. cerere nodul.

În acest moment, aplicația dvs. ar trebui să poată găsi orice dispozitive de turnare listate în alb și să le conecteze prin intermediul aplicației.

Rulare dialog Dialog

În funcție de tema pe care o utilizați în aplicația dvs. (cum ar fi Theme.AppCompat.Light.NoActionBar), este posibil să fi observat unele comportamente ciudate cu culori în dialogul dispozitivului de turnare, cum ar fi fontul alb și pictogramele pe un fundal alb. 

De asemenea, puteți decide că doriți să personalizați modul în care dialogul pare să se potrivească cu aplicația dvs. Puteți face acest lucru prin suprascrierea celor două stiluri utilizate pentru dialogul Cast: Theme.MediaRouter.Light.DarkControlPanel și Theme.MediaRouter.LightControlPanel. De exemplu, dacă rulați în font alb pe un fond alb, puteți include în codul dvs. următoarele coduri styles.xml fișier pentru a schimba pictogramele și culoarea fontului pentru a fi negre pe fondul alb.

 

Conținutul Casting

După ce v-ați conectat la un dispozitiv de distribuire, probabil că doriți să permiteți utilizatorilor să distribuie conținut în acesta. Din fericire, SDK-ul Cast face acest lucru incredibil de ușor de făcut. În aplicația dvs., veți dori să stabiliți dacă utilizatorul dvs. sa conectat la un dispozitiv, ceea ce se poate face prin asigurarea faptului că acesta SessionManager are un curent Sesiune și că curentul Sesiune are o RemoteMediaClient obiect asociat cu acesta.

dacă CastContext.getSharedInstance (this) .getSessionManager () getCurrentCastSession ()! = null && CastContext.getSharedInstance (this) .getSessionManager () getCurrentCastSession () getRemoteMediaClient ()

Odată ce știți că aplicația este asociată cu o RemoteMediaClient, veți dori să creați o MediaInfo obiect care conține o legătură către conținutul de la distanță pe care doriți să îl redați, precum și tipurile de streaming și de conținut pentru mass-media. Cand MediaInfo este creat și populat, puteți apela metoda de încărcare pe RemoteMediaClient pentru a începe difuzarea conținutului. De exemplu, următorul cod va distribui un fișier video la televizor.

RemoteMediaClient remoteMediaClient = CastContext.getSharedInstance (acest) .getSessionManager (). GetCurrentCastSession () getRemoteMediaClient (); MediaInfo mediaInfo = nou MediaInfo.Builder (getString (R.string.movie_link)) .setStreamType (MediaInfo.STREAM_TYPE_BUFFERED). SetContentType ("videoclipuri / mp4") .build (); remoteMediaClient.load (mediaInfo, true, 0);

metadate

Componentele pentru receptor și componentele UI din SDK Cast folosesc a MediaMetadata obiect pentru stocarea și referirea la informații despre media care este în prezent redată. Puteți adăuga valori la acest obiect folosind tastele furnizate de clasă și puteți adăuga URL-uri de imagini utilizând adauga imagine metodă.

MediaMetadata metadate = nou MediaMetadata (MediaMetadata.MEDIA_TYPE_MOVIE); metadata.putString (MediaMetadata.KEY_TITLE, "Titlu"); metadata.putString (MediaMetadata.KEY_SUBTITLE, "Subtitrare"); metadata.addImage (noul WebImage (Uri.parse (getString (R.string.movie_poster))));

Odata ce MediaMetadata obiect este creat, îl puteți asocia cu conținutul acestuia MediaInfo.

MediaInfo mediaInfo = nou MediaInfo.Builder (getString (R.string.movie_link)) .setStreamType (MediaInfo.STREAM_TYPE_BUFFERED) .setContentType ("videoclipuri / mp4") .setMetadata (metadate) .build ();

UI Componente

În timp ce SDK Cast distribuie logica pentru conectarea și difuzarea conținutului la televizor, acesta oferă, de asemenea, mai multe componente UI care îi ajută pe dezvoltatori să respecte regulamentul de proiectare al Casting UI. 

Introducere suprapunere

Când utilizatorul dvs. vă deschide mai întâi aplicația, este recomandat să îi informați că susțineți Google Cast. Puteți face acest lucru prin includerea unui IntroductoryOverlay, care va scoate în evidență butonul de distribuție pe măsură ce devine disponibil pentru prima dată. 

Pentru a include IntroductoryOverlay, primul lucru pe care doriți să-l faceți este să îl adăugați ca variabilă membru în partea de sus a activității dvs. principale.

private IntroductoryOverlay mIntroductoryOverlay;

Odată ce aveți un obiect obișnuit pentru suprapunere, puteți crea o metodă care să verifice dacă se afișează butonul routerului media și dacă este afișat, va afișa suprapunerea. 

Această componentă este dezvoltată folosind un model simplu de constructor care acceptă a Şir pentru text, un ID de resursă de culoare și câteva atribute de personalizare. De cele mai multe ori, veți dori, de asemenea, să vă asigurați că sunați setSingleTime (), astfel încât suprapunerea să fie afișată o singură dată pentru utilizator.

privat void showIntroductoryOverlay () if (mIntroductoryOverlay! = null) mIntroductoryOverlay.remove ();  dacă ((mMediaRouterButton! = null) && mMediaRouterButton.isVisible ()) new Handler () post (nou Runnable () @Override public void run () mIntroductoryOverlay = new IntroductoryOverlay.Builder (MainActivity.this, mMediaRouterButton) .setTitleText ("Text introductiv") .setOverlayColor (R.color.colorPrimary) .setSingleTime () .setOnOverlayDismissedListener (nou IntroductoryOverlay.OnOverlayDismissedListener () @Override public void onOverlayDismissed () mIntroductoryOverlay = null;) .build ; mIntroductoryOverlay.show ();); 

Acum că aveți o metodă creată pentru a afișa suprapunerea, va trebui pur și simplu să o apelați. Există două puncte în care trebuie să adăugați această metodă: în onCreateOptionsMenu, si in onCastStateChanged de la tine CastStateListener când statul nu este NO_DEVICES_AVAILABLE. Acest lucru se va ocupa de ambele situații de urgență când se poate afișa butonul de rutare.

@Override publică void onCastStateChanged (int newState) if (newState! = CastState.NO_DEVICES_AVAILABLE) showIntroductoryOverlay ();  @Override public boolean onCreateOptionsMenu (meniu meniu) super.onCreateOptionsMenu (meniu); getMenuInflater () se umflă (R.menu.menu_main, meniu); mMediaRouterButton = CastButtonFactory.setUpMediaRouteButton (getApplicationContext (), meniu, R.id.media_route_menu_item); showIntroductoryOverlay (); return true; 

În acest moment, ar trebui să puteți să porniți aplicația și să vedeți suprapunerea, după cum se arată în figura următoare. Dacă doriți să îl vedeți din nou în scopuri de testare, puteți șterge datele aplicației și puteți redeschide.

Control extins

În timp ce filmați, veți dori să puteți oferi un widget UI ușor pentru a controla conținutul pe televizorul utilizatorului. Google a făcut acest lucru ușor prin furnizarea ExpandedControllerActivity clasă în SDK distribuit. 

Pentru a utiliza aceasta, creați o nouă clasă Java și extindeți-o ExpandedControllerActivity. Acest tutorial va crea unul numit ExpandedControlsActivity. Odată ce activitatea dvs. este creată, actualizați-vă onCreateOptionsMenu pentru a include butonul de rutare a turnării în bara de instrumente.

clasa publică ExpandedControlsActivity se extinde la ExpandedControllerActivity @Override public boolean onCreateOptionsMenu (meniu meniu) super.onCreateOptionsMenu (meniu); getMenuInflater () se umflă (R.menu.menu_main, meniu); CastButtonFactory.setUpMediaRouteButton (acest meniu, R.id.media_route_menu_item); return true; 

Apoi, deschide-ți OptionsProvider clasă. Veți dori să intrați în getCastOptions și creați un CastMediaOptions obiect care se leagă de dvs. ExpandedControllerActivity. Odată ce ai fost CastMediaOptions obiect este creat, îl puteți asocia cu CastOptions element returnat prin metoda.

CastMediaOptions mediaOptions = nou CastMediaOptions.Builder () .setExpandedControllerActivityClassName (ExpandedControlsActivity.class.getName ()) .build (); CastOptions castOptions = nou CastOptions.Builder () .setResumeSavedSession (adevărat) .setEnableReconnectionService (true) .setReceiverApplicationId (context.getString (R.string.cast_app_id)). SetCastMediaOptions (mediaOptions) .build (); returnOptions;

În cele din urmă, pentru a obține o muncă ExpandedControllerActivity, va trebui să îl includeți AndroidManifest.xml, ca astfel.

     

Ar trebui să observați că activitate nodul are a temă set de proprietate. Acest stil este folosit pentru a personaliza opțional ExpandedControllerActivity și butoanele care sunt afișate. 

Controlerul este alcătuit din patru sloturi personalizabile ale butoanelor, cu comutator de joc / pauză în mijloc. Folosind un nou stil și resurse de array, puteți particulariza ce butoane apar. În arrays.xml, Am adăugat un nou mulțime care plasează slotul 1 pentru golire, slotul 2 la butonul de derulare de 30 de secunde, slotul 3 (primul element din dreapta comutării redare / pauză) pentru a derula înainte în 30 de secunde, iar ultimul slot pentru a găzdui o oprire mut. 

   @ 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  

Puteți asocia acest lucru mulțime cu tine Activitate prin crearea noului dvs. stil resurse și de prioritate castExpandedControllerStyle valoare cu un nou stil care se extinde CastExpandedController.

 

În acest moment, ar trebui să puteți să faceți clic pe imaginea din fereastra de dialog a routerului pentru a încărca suporturi media pentru a deschide noul controler Activitate, sau lansați-vă singur din aplicația dvs. cu un simplu startActivity apel.

startActivity (nou intenție (aceasta, ExpandedControlsActivity.class));

Comenzile de notificare / blocare a ecranului

Atunci când un utilizator distribuie conținut pe televizor, există șanse mari ca acesta să nu păstreze aplicația în prim plan sau telefonul să fie deblocat. Când navighează departe de aplicația dvs., veți dori să le oferiți o modalitate ușoară de a controla conținutul aplicației. Puteți face acest lucru prin adăugarea unei notificări la aplicația dvs. atunci când nu se află în prim plan pentru dispozitivele Lollipop și cele de mai sus, iar SDK Cast se va ocupa de crearea unui ecran de blocare RemoteControlClient pentru KitKat și dispozitive anterioare.

Adăugarea comenzilor de notificare / de blocare a ecranului este destul de simplă, deoarece totul este tratat în getCastOptions metoda dvs. OptionsProvider (CastOptionsProvider.java pentru acest tutorial). 

În primul rând, va trebui să creați un ArrayList de șiruri care conțin butoanele pe care le doriți pentru comenzile dvs. Apoi, puteți crea un int array care va conține indicii butoanelor pe care doriți să le afișați când notificarea este în modul compact. 

Odată ce ați creat cele două matrice, veți crea un a NotificationOptions obiect care leagă acțiunile de noile notificări și le atribuie Activitate să se deschidă la selectarea notificării. Pentru acest exemplu, vom folosi pur și simplu ExpandedControlsActivity pe care am creat-o în ultima secțiune. 

În cele din urmă, puteți adăuga notificarea către dvs. CastMediaOptions

Listă buttonActions = nou ArrayList <> (); buttonActions.add (MediaIntentReceiver.ACTION_TOGGLE_PLAYBACK); buttonActions.add (MediaIntentReceiver.ACTION_STOP_CASTING); int [] compatButtonActionsIndicies = nou int [] 0, 1; NotificareOptions notificationOptions = new NotificationOptions.Builder () .setActions (buttonActions, compatButtonActionsIndicies) .setTargetActivityClassName (ExpandedControlsActivity.class.getName ()) .build (); CastMediaOptions mediaOptions = nou CastMediaOptions.Builder () .setNotificationOptions (notificationOptions) .setExpandedControllerActivityClassName (ExpandedControlsActivity.class.getName ()) .build ();

Acum, când utilizatorii dvs. aruncă conținut pe televizoarele lor și blochează ecranul sau se deplasează de la aplicația dvs., va apărea o notificare care îi permite să controleze conținutul pe ecranul mare în timp ce continuă să interacționeze cu telefonul. Dacă faceți clic pe notificarea din afara controalelor, aplicația dvs. va reveni în prim plan cu ExpandedControlsActivity, oferindu-le utilizatorilor mai mult control asupra experienței lor de vizionare.

Controller mini

Ultimul widget UI pe care îl veți afla în acest tutorial este MiniControllerFragment. Acest element poate fi plasat în fișierele de aspect ale activității dvs. și atunci când aplicația dvs. difuzează conținut, acesta va deveni automat vizibil și va oferi un controler ușor accesat pentru utilizatorii dvs. în timp ce navighează aplicația dvs. Deși aceasta este ultima componentă pe care o vom discuta, este, de asemenea, cea mai ușoară implementare. Pur și simplu trebuie să-l includeți în fișierele de aspect, ca atare.

Când faceți clic pe acest element oriunde în afara butonului de redare / pauză, vă ExtendedControllerActivity va fi crescut, oferindu-le utilizatorilor acces ușor la conținutul de pe televizor.

Concluzie

În acest tutorial ați învățat multe despre noul SDK Google Cast pentru Android, despre componentele UI furnizate în cadrul acestuia și despre modul de creare a unei aplicații de bază pentru receptor pentru o casting. Ceea ce ați acoperit aici vă va ajuta să construiți cele mai frecvente tipuri de aplicații de distribuție, deși Google oferă și funcții care vă vor permite să creați rapid jocuri și aplicații personalizate.

Cod