Det er mange populære tredjeparts YouTube-klienter på Google Play, for eksempel Viral Popup og PlayTube, som klarer å tilby noen unike og tilleggsfunksjoner som den offisielle YouTube-appen ikke gjør. Hvis du vil bygge en slik app selv, er denne opplæringen for deg.
I denne opplæringen lager vi vår egen YouTube-klient som ikke bare kan søke etter videoer på YouTube, men også spille dem. Når du gjør det, lærer vi hvordan du bruker YouTube-spilleren til YouTube og klientbiblioteket for YouTube Data API for Java.
Sørg for at du har den nyeste Eclipse ADT Bundle satt opp. Du kan laste den ned på Android Developer-nettstedet.
Du må også ha en utvikler nøkkel for å bruke YouTube API. Følg trinnene på Googles YouTube Developer-nettsted for å få en.
Brann opp Eclipse og opprett et nytt Android-program. Navn søknaden, SimplePlayer
. Velg et unikt pakke navn, og sett inn minimumskrav SDK til Android 2.2 og mål SDK til Android 4.X (L Preview).
Vi skal lage Aktivitet
oss så avvelg Opprett aktivitet og klikk Bli ferdig.
Du trenger følgende biblioteker for dette prosjektet:
For å legge til YouTube Android Player API, unzip YouTubeAndroidPlayerApi-1.0.0.zip og kopier filen YouTubeAndroidPlayerApi.jar til libs mappe av prosjektet ditt.
For å legge til YouTube Data API v3-biblioteket og dets avhengigheter, unzip google-api-services-youtube-v3-rev124-java-1.19.0.zip og kopier følgende filer til libs mappe av prosjektet ditt:
Til slutt, for å legge til Picasso, kopier picasso-2.4.0.jar til libs mappe av prosjektet ditt.
Den eneste tillatelsen vår app trenger er android.permission.INTERNET
for å få tilgang til YouTubes servere. Legg til følgende til AndroidManifest.xml:
Vår app har to aktiviteter, en for å søke etter videoer og en for å spille dem. For å unngå å måtte håndtere orienteringsendringer i denne opplæringen, tvinger vi begge aktivitetene til å bare bruke liggende modus. Erklære aktivitetene i manifestet ved å legge til følgende kode for det:
De res / verdier / strings.xml
filen inneholder strenger som vår app bruker. Oppdater innholdet som vist nedenfor:
SimplePlayer Søke Kunne ikke initialisere Youtube Player
SearchActivity
SearchActivity
trenger følgende synspunkter:
EditText
: å la brukeren skrive inn søkeordeneListevisning
: for å vise søkeresultateneLinearLayout
: Denne visningen fungerer som overordnet visning av de nevnte visningerOpprett en ny fil som heter oppsett / activity_search.xml og legg til følgende kode for det:
Hvert søkeresultat refererer til en video på YouTube, og vi trenger et oppsett for å vise informasjon om videoen. Derfor er hvert element av Listevisning
må inneholde følgende visninger:
Imageview
: for å vise miniatyrbildet for videoenTextView
: å vise tittelen på videoenTextView
: for å vise beskrivelsen av videoenRelativeLayout
: Denne visningen fungerer som overordnet visning av de andre visningeneOpprett en fil som heter oppsett / video_item.xml og legg til følgende kode for det:
PlayerActivity
PlayerActivity
trenger følgende synspunkter:
YouTubePlayerView
: å spille YouTube-videoerLinearLayout
: denne visningen er overordnet visning av YouTubePlayerView
Opprett en ny fil som heter oppsett / activity_player.xml og legg til følgende kode for det:
VideoItem
Opprett en ny Java-klasse som heter VideoItem.java. Vi bruker denne klassen til å lagre følgende informasjon om en YouTube-video:
Alt ovenfor er lagret som strenger. Etter å legge til getters og setters for hver av dem, VideoItem.java filen skal ha følgende innhold:
pakke com.hathi.simpleplayer; offentlig klasse VideoItem private String title; privat streng beskrivelse; Private String thumbnailURL; privat streng ID; offentlig String getId () retur id; offentlig tomgang setId (String id) this.id = id; offentlig String getTitle () retur tittel; Offentlig tomgang setTitle (Stringtittel) this.title = title; Offentlig String getDescription () return description; Offentlig tomt settDescription (String beskrivelse) this.description = description; Offentlig String getThumbnailURL () return thumbnailURL; offentlig tomgangssettThumbnailURL (streng miniatyr) this.thumbnailURL = miniatyrbilde;
For å unngå å måtte håndtere YouTube Data API direkte i vår Aktivitet
, opprett en ny Java-klasse og gi den navnet YoutubeConnector.java. Denne klassen har følgende medlemsvariabler:
YouTube
klassen som vil bli brukt til å kommunisere med YouTube APIYouTube.Search.List
å representere et søkstring
Vi initialiserer ovennevnte variabler i konstruktøren. For å initialisere forekomsten av YouTube
, de YouTube.Builder
klassen må brukes. Klassene som vil være ansvarlige for nettverksforbindelsen og JSON-prosesseringen, sendes til byggeren.
En gang initialisert, dens Søke
Metoden brukes til å opprette en søknadsforespørsel. De liste
Metoden brukes da til å nevne detaljene vi ønsker i søkeresultatene. For denne opplæringen skal vi trenge en id
og tekstutdrag
for hvert søkeresultat. Fra disse, trekker vi ut følgende felt:
id / VIDEOID
kodebit / tittel
tekstutdrag / beskrivelse
tekstutdrag / thumbnails / default / url
Utviklerens API-nøkkel må sendes med hver søknadsforespørsel. De setKey
Metoden brukes til dette formålet. Vi bruker også setType
metode for å begrense søkeresultatene til videoer
bare. På dette tidspunktet bør klassen se slik ut:
pakke com.hathi.simpleplayer; offentlig klasse YoutubeConnector private YouTube youtube; privat YouTube.Search.List spørring; // Din utvikler nøkkel går her offentlig statisk endelig String KEY = "AIzaSQZZQWQQWMGziK9H_qRxz8g-V6eDL3QW_Us"; offentlig YoutubeConnector (Context context) youtube = ny YouTube.Builder (ny NetHttpTransport (), ny JacksonFactory (), ny HttpRequestInitializer () @Override public void initialize (HttpRequest hr) kaster IOException ) setApplicationName (content.getString (R.string.app_name)) bygge (.); prøv query = youtube.search (). liste ("id, snippet"); query.setKey (KEY); query.setType ( "video"); query.setFields ( "elementer (id / VIDEOID, tekstutdrag / tittel, tekstutdrag / beskrivelse, tekstutdrag / thumbnails / default / url)"); catch (IOException e) Log.d ("YC", "Kunne ikke initialisere:" + e);
Deretter oppretter vi en metode som heter Søke
å utføre søket basert på brukerens søkeord. Denne metoden aksepterer søkeordene som en string
parameter. De spørsmål
variabel setQ
Metoden brukes til å sette søkeordene.
Vi kjører deretter spørringen ved hjelp av den henrette
metode. Resultatene returneres i form av a SearchListResponse
forekomst. Vi repeterer gjennom resultatene og lager en ny Liste
av VideoItem
objekter, som vil være verdien av denne metoden. Etter at du har lagt til riktig feilhåndtering, vil Søke
metoden skal se slik ut:
offentlig listesøk (streng søkeord) query.setQ (søkeord); prøv SearchListResponse response = query.execute (); Liste resultater = respons.getItems (); Liste elementer = ny ArrayList (); for (SearchResult resultat: resultater) VideoItem item = new VideoItem (); item.setTitle (result.getSnippet () getTitle ().); item.setDescription (result.getSnippet () getDescription ().); item.setThumbnailURL (result.getSnippet () getThumbnails () getDefault () getUrl ()...); item.setId (result.getId () getVideoId ().); items.add (pos); returelementer; fangst (IOException e) Log.d ("YC", "Kunne ikke søke:" + e); return null;
SearchActivity
Opprett en ny klasse som heter SearchActivity.java. Denne klassen har felt som representerer visningene vi nevnte i activity_search.xml. Den har også a handler
for å gjøre oppdateringer på brukergrensesnitt-tråden.
I onCreate
metode, vi initialiserer visningene og legger til en OnEditorActionListener
til EditText
å vite når brukeren er ferdig med å skrive inn søkeord.
offentlig klasse SearchActivity utvider Aktivitet privat EditText searchInput; private ListView videosFound; Privat Handler Handler; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_search); searchInput = (EditText) findViewById (R.id.search_input); videosFound = (ListView) findViewById (R.id.videos_found); handler = ny Handler (); searchInput.setOnEditorActionListener (ny TextView.OnEditorActionListener () @Override public boolean onEditorAction (TextView v, int actionId, KeyEvent-hendelse) if (actionId == EditorInfo.IME_ACTION_DONE) searchOnYoutube (v.getText (). toString ()); return false; return true;);
Du må ha lagt merke til anropet til searchOnYoutube
metode. La oss definere metoden nå. I denne metoden lager vi en ny Tråd
å initialisere en YoutubeConnector
forekomme og drive sin Søke
metode. En ny tråd er nødvendig, fordi nettverksoperasjoner ikke kan utføres på hovedbrukergrensesnittet. Hvis du glemmer å gjøre dette, vil du møte et runtime unntak. Når resultatene er tilgjengelige, vil behandleren
brukes til å oppdatere brukergrensesnittet.
privat listeSøkeresultater; private void searchOnYoutube (final string-søkeord) new thread () public void run () YoutubeConnector yc = ny YoutubeConnector (SearchActivity.this); searchResults = yc.search (søkeord); handler.post (nytt Runnable () public void run () updateVideosFound ();); .start();
I updateVideosFound
metode, genererer vi en ArrayAdapter
og send det videre til Listevisning
for å vise søkeresultatene. I getView
Metoden til adapteren, vi blåser opp video_item.xml layout og oppdater visningene for å vise informasjon om søkeresultatet.
Picasso biblioteket er laste
Metoden brukes til å hente miniatyrbildet av videoen og inn i
Metoden brukes til å overføre den til Imageview
.
privat ugyldig oppdateringVideosFound () ArrayAdapteradapter = ny ArrayAdapter (getApplicationContext (), R.layout.video_item, searchResults) @Override public Vis getView (int posisjon, se convertView, ViewGroup forelder) if (convertView == null) convertView = getLayoutInflater (). oppblåse (R.layout. video_item, foreldre, falsk); ImageView thumbnail = (ImageView) convertView.findViewById (R.id.video_thumbnail); TextView title = (TextView) convertView.findViewById (R.id.video_title); TextView description = (TextView) convertView.findViewById (R.id.video_description); VideoItem searchResult = searchResults.get (posisjon); . Picasso.with (getApplicationContext ()) belastning (searchResult.getThumbnailURL ()) til (miniatyr.); title.setText (searchResult.getTitle ()); description.setText (searchResult.getDescription ()); returnere konvertereView; ; videosFound.setAdapter (adapter);
Endelig trenger vi en metode som setter OnItemClickListener
av Listevisning
slik at brukeren kan klikke på et søkeresultat og se den tilhørende videoen. La oss nevne denne metoden addClickListener
og ring det på slutten av onCreate
metode.
Når et element i listen er tappet, oppretter vi en ny Intent
for PlayerActivity
og passere i IDen til videoen. Først når Intent
er opprettet, den startActivity
Metoden brukes til å starte PlayerActivity
.
privat ugyldig addClickListener () videosFound.setOnItemClickListener (ny AdapterView.OnItemClickListener () @Override public void onItemClick (AdapterView> av, Vis v, int pos, lang id) Intent intention = new Intent (getApplicationContext (), PlayerActivity.class); intent.putExtra ("VIDEO_ID", searchResults.get (pos) .getId ()); startActivity (hensikt); );
PlayerActivity
Opprett en ny Java-klasse som heter PlayerActivity.java som arver fra YouTubeBaseActivity
. Dette er viktig, fordi bare underklasser av YouTubeBaseActivity
kan gjøre bruk av YouTubePlayerView
.
Denne klassen har en enkelt variabel som representerer YouTubePlayerView
vi nevnte i activity_player.xml layoutfil. Dette initialiseres i onCreate
metode ved å påkalle initialiseringsmetoden til YouTubePlayerView
klasse, passerer i utviklerens API-nøkkel.
Deretter må vår klasse implementere OnInitializedListener
grensesnitt for å vite når initialiseringen er fullført. Grensesnittet har to metoder, oppkalt onInitializationFailure
og onInitializationSuccess
.
I tilfelle av suksess, cueVideo
Metoden brukes til å vise YouTube-videoen. Ved feil, a Skål
vises som forteller brukeren at initialiseringen mislyktes.
Dette er hva PlayerActivity
klassen skal se ut som:
offentlig klasse PlayerActivity utvider YouTubeBaseActivity implementerer OnInitializedListener privat YouTubePlayerView playerView; @Override protected void onCreate (Bundle bundle) super.onCreate (bunt); setContentView (R.layout.activity_player); playerView = (YouTubePlayerView) findViewById (R.id.player_view); playerView.initialize (YoutubeConnector.KEY, dette); @Override public void onInitializationFailure (leverandørleverandør, YouTubeInitializationResult resultat) Toast.makeText (dette, getString (R.string.failed), Toast.LENGTH_LONG) .show (); @Override public void onInitializationSuccess (Leverandørleverandør, YouTubePlayer-spiller, boolsk gjenopprettet) hvis (!)) Player.cueVideo (getIntent (). GetStringExtra ("VIDEO_ID"));
Vår YouTube-klient er nå klar til å bli distribuert til en Android-enhet. Nesten alle populære Android-enheter har den installert, men sørg for at YouTube-appen er installert og oppdatert på enheten, fordi vår app er avhengig av den.
Når du er distribuert, bør du kunne skrive inn en spørring for å søke etter videoer på YouTube, og deretter klikke på et resultat for å begynne å spille den tilsvarende videoen.
Du kan nå legge inn YouTube-videoer i Android-appen din. Du har også lært hvordan du bruker Google API-klientbiblioteket og samhandler med YouTube. Android Player API gir mange metoder for å kontrollere avspillingen av videoene, og du kan bruke dem til å komme opp med svært kreative apper. Se den komplette referanseguideen for å lære mer om API-en.