În această serie, creăm un player de muzică pe Android utilizând Media Player
și MediaController
clase. În prima parte, am creat aplicația și am pregătit interfața pentru redare. Am prezentat lista de melodii pe dispozitivul utilizatorului și am specificat o metodă de executare atunci când utilizatorul face o selecție. În această parte a seriei, vom implementa a Serviciu
clasa pentru a executa continuu redarea muzicii, chiar dacă utilizatorul nu interacționează direct cu aplicația.
Această serie vă oferă întregul proces de creare a unui player muzical Android de la zero, dar o altă opțiune este folosirea unuia dintre șabloanele aplicațiilor pentru muzică de pe Envato Market, cum ar fi Android Music Player, care permite utilizatorilor să navigheze și să redea muzică după albume, artiști, melodii, playlisturi, dosare și artiști de album.
Android Music PlayerSau, pentru un ajutor mai personalizat, ați putea angaja un dezvoltator de aplicații mobile pe Envato Studio. În acest fel, puteți obține ajutor fiabil și la prețuri accesibile pentru orice aspect al muncii de dezvoltare cu care nu vă simțiți confortabil și concentrați-vă energia și timpul în zone în care sunteți mai puternic.
Vom avea nevoie ca aplicația să se lege de muzică Serviciu
în scopul de a interacționa cu redarea, astfel încât veți învăța unele dintre aspectele de bază ale Serviciu
ciclu de viață în acest tutorial dacă nu le-ați explorat înainte. Iată o previzualizare a rezultatului final la care lucrăm:
În ultima tranșă a acestei serii, vom adăuga controlul utilizatorului asupra redării și vom asigura, de asemenea, că aplicația va continua să funcționeze în diferite stări de aplicație. Mai târziu, vom urmări seria cu îmbunătățiri suplimentare pe care ați dori să le adăugați, cum ar fi controlul focalizării audio, redarea video și streaming media și modalități alternative de prezentare a fișierelor media.
Adăugați o clasă nouă în aplicația dvs., numind-o MusicService sau alt nume la alegere. Asigurați-vă că se potrivește cu numele pe care l-ați enumerat în Manifest. Când creați clasa în Eclipse, alegeți android.app.Service
ca superclaj. Eclipse ar trebui să introducă un contur:
clasa publica MusicService extinde Serviciul @Override public IBinder onBind (Intenție arg0) // TODO Metoda generată automat de stub return null;
Extindeți linia de deschidere a declarației de clasă pentru a implementa unele interfețe pe care le vom folosi pentru redarea muzicii:
clasa publică MusicService extinde Serviciul implementează MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener
Eclipse va afișa o eroare peste numele clasei. Plasați cursorul peste eroare și alegeți Adăugați metode neimplementate. Vom adăuga codul metodelor în câteva momente. Interfețele pe care le punem în aplicare vor facilita procesul de interacțiune cu Media Player
clasă.
Clasa dvs. va necesita, de asemenea, următoarele importuri suplimentare:
import java.util.ArrayList; importați android.content.ContentUris; import android.media.AudioManager; importul android.media.MediaPlayer; importul android.net.Uri; import șiroid.os.Binder; import șiroid.os.PowerManager; import șiroid.util.Log;
Adăugați următoarele variabile de instanță la noul Serviciu
clasă:
// media player MediaPlayer privat; // lista de melodii private ArrayListcântece; // poziție curentă private songPosn;
Vom trece lista melodiilor în Serviciu
clasa, jucând de la ea folosind Media Player
clasa și urmărirea poziției cântecului curent folosind songPosn
variabila de instanta. Acum, pune în aplicare onCreate
metoda pentru Serviciu
:
public void onCreate () // crea serviciul
Interior onCreate
, apelați metoda superclass, instanțiând poziția și Media Player
variabile de instanta:
// creați serviciul super.onCreate (); // initializeaza pozitia songPosn = 0; // crea jucator player = nou MediaPlayer ();
Apoi, să adăugăm o metodă pentru a inițializa Media Player
clasa, după onCreate
metodă:
public void initMusicPlayer () // setarea proprietăților playerului
În cadrul acestei metode, configurăm music player-ul setând unele dintre proprietățile sale, după cum se arată mai jos:
player.setWakeMode (getApplicationContext (), PowerManager.PARTIAL_WAKE_LOCK); player.setAudioStreamType (AudioManager.STREAM_MUSIC);
Blocarea trezirii va permite ca redarea să continue atunci când dispozitivul nu mai funcționează și am setat tipul de flux la muzică. Setați clasa ca ascultător pentru (1) atunci când Media Player
(2) atunci când o melodie a terminat redarea și când (3) o eroare este aruncată:
player.setOnPreparedListener (aceasta); player.setOnCompletionListener (aceasta); player.setOnErrorListener (aceasta);
Observați că acestea corespund interfețelor pe care le-am implementat. Vom adăuga codul la onPrepared
, onCompletion
, și onerror
metode pentru a răspunde acestor evenimente. Înapoi în onCreate
, invoca initMusicPlayer
:
initMusicPlayer ();
Este timpul să adăugați o metodă la Serviciu
clasa pentru a trece lista de melodii de la Activitate
:
public void setList (ArrayListSongs) songs = TheSongs;
Vom numi această metodă mai târziu în tutorial. Aceasta va face parte din interacțiunea dintre Activitate
și Serviciu
clase, pentru care avem nevoie de asemenea Liant
instanță. Adăugați fragmentul următor în Serviciu
clasa după setlist
metodă:
clasa publica MusicBinder extinde Binder MusicService getService () return MusicService.this;
De asemenea, vom accesa acest lucru de la Activitate
clasă.
Înapoi în principalul aplicației Activitate
, va trebui să adăugați următoarele importuri suplimentare:
import șiroid.os.IBinder; importați android.content.ComponentName; importați android.content.Context; import șiroid.content.Intent; import android.content.ServiceConnection; import șiroid.view.MenuItem; import șiroid.view.View;
De asemenea, va trebui să declarați trei variabile de instanță noi:
muzică privată MusicServiceSrv; intenția privată playIntent; boolean privat musicBound = false;
Vom juca muzica în Serviciu
clasa, dar controlează-o de la Activitate
, în care funcționează interfața de utilizator a aplicației. Pentru a realiza acest lucru, va trebui să ne angajăm Serviciu
clasă. Variabilele instanței de mai sus reprezintă Serviciu
clasă și scop
, precum și un steag pentru a urmări dacă Activitate
clasa este legată de Serviciu
clasa sau nu. Adăugați următoarele la dvs. Activitate
clasa, după onCreate
metodă:
// conectați serviciul privat ServiceConnection musicConnection = new ServiceConnection () @Override public void onServiceConnected (numele ComponentName, serviciul IBinder) MusicBinder binder = (MusicBinder) serviciu; // primi serviciul musicSrv = binder.getService (); // trece lista musicSrv.setList (songList); musicBound = adevărat; @Override publice void onServiceDisconnected (nume_componentName) musicBound = false; ;
Metodele de apel invers vor informa clasa atunci când Activitate
instanța sa conectat cu succes la Serviciu
instanță. Când se întâmplă acest lucru, vom lua o referință la Serviciu
exemplu, astfel încât Activitate
pot interacționa cu el. Începe prin apelarea metodei pentru a trece lista de melodii. Am setat steagul boolean pentru a urmări starea obligatorie. Va trebui să importați Liant
clasa pe care am adăugat-o la Serviciu
de clasă în partea de sus a dvs. Activitate
clasă:
import com.example.musicplayer.MusicService.MusicBinder;
Nu uitați să modificați numele pachetului și al claselor, dacă este necesar.
Vom dori să începem Serviciu
atunci când Activitate
instanța începe, deci suprascrie onStart
metodă:
@Override protejate void onStart () super.onStart (); dacă (playIntent == null) playIntent = intenție nouă (acest lucru, MusicService.class); bindService (playIntent, musicConnection, Context.BIND_AUTO_CREATE); startService (playIntent);
Cand Activitate
instanța începe, noi creăm scop
obiect dacă nu există încă, legați-l și porniți-l. Modificați codul dacă alegeți un alt nume pentru Serviciu
clasă. Observați că folosim obiectul de conexiune pe care l-am creat astfel încât atunci când conexiunea la legat Serviciu
instanta este facuta, trecem lista melodiilor. De asemenea, vom putea să interacționăm cu Serviciu
pentru a controla mai târziu redarea.
Întoarce-te la tine Serviciu
pentru a finaliza acest proces de legare. Adăugați o variabilă de instanță reprezentând elementul interior Liant
clasa pe care am adăugat-o:
finală privată IBinder musicBind = new MusicBinder ();
Acum modificați onBind
pentru a returna acest obiect:
@Override publice IBinder onBind (intentul intenției) retur musicBind;
Adaugă onUnbind
metoda de a elibera resurse atunci când Serviciu
instanta este nelegata:
@Override public boolean onUnbind (intenția intenției) player.stop (); player.release (); return false;
Aceasta se va executa atunci când utilizatorul va părăsi aplicația, moment în care vom opri serviciul.
Acum, setați aplicația pentru a reda o piesă. În tine Serviciu
clasă, adăugați următoarea metodă:
public void playSong () // a cânta o melodie
În interiorul metodei, începeți prin resetarea Media Player
deoarece vom folosi și acest cod când utilizatorul va reda melodii ulterioare:
player.reset ();
Apoi, obțineți cântecul din listă, extrageți codul de identificare pentru acesta utilizând Cântec
obiect și modelați acest lucru ca un URI:
// cântecul Song playSong = songs.get (songPosn); // obține id lung currSong = playSong.getID (); // set uri Uri trackUri = ContentUris.withAppendedId (șiroid.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, currSong);
Acum putem încerca să setăm acest URI ca sursă de date pentru Media Player
exemplu, dar o excepție poate fi aruncată dacă apare o eroare, așa că folosim a încearcă să prinzi
bloc:
încercați player.setDataSource (getApplicationContext (), trackUri); captură (Excepție e) Log.e ("MUSIC SERVICE", "Eroare la stabilirea sursei de date", e);
După captură
bloc, completați playSong
metoda prin apelarea metodei asincrone a Media Player
să-l pregătească:
player.prepareAsync ();
Cand Media Player
este pregătit, onPrepared
metoda va fi executată. Eclipse ar fi trebuit să o introducă în Serviciu
clasă. În cadrul acestei metode, porniți redarea:
@Override public void onPrepared (MediaPlayer mp) // începe redarea mp.start ();
Pentru ca utilizatorul să poată selecta melodii, avem nevoie și de o metodă în Serviciu
pentru a seta melodia curentă. Adăugați-l acum:
public void setSong (int songIndex) songPosn = songIndex;
Vom numi acest lucru atunci când utilizatorul alege o melodie din listă.
Amintiți-vă că am adăugat un onClick
atribuiți aspectului pentru fiecare element din lista de melodii. Adăugați metoda respectivă la principiul principal Activitate
clasă:
public void songPicked (Vizualizare vedere) musicSrv.setSong (Integer.parseInt (view.getTag (). toString ())); musicSrv.playSong ();
Am setat poziția cântecului ca etichetă pentru fiecare element în vizualizarea listei atunci când am definit adaptor
clasă. Îl recuperăm aici și îl transmitem Serviciu
înainte de a apela metoda pentru a începe redarea.
Înainte de a rula aplicația, implementați-o Sfârșit butonul pe care l-am adăugat în meniul principal. În principal Activitate
, adăugați metoda pentru a răspunde la selecția elementelor de meniu:
@Override public boolean onOptionsItemSelected (elementul MenuItem) // element de meniu selectat
În cadrul metodei, adăugați o instrucțiune de comutare pentru acțiuni:
comuta (item.getItemId ()) caz R.id.action_shuffle: // break shuffle; caz R.id.action_end: stopService (playIntent); musicSrv = null; System.exit (0); pauză; retur super.onOptionsItemSelected (element);
Vom implementa funcția Shuffle în următorul tutorial. Pentru Sfârșit butonul, oprim Serviciu
și închideți aplicația. Apăsarea butonului din spate nu va părăsi aplicația, deoarece vom presupune că utilizatorul dorește ca redarea să continue dacă nu selectați Sfârșit buton. Utilizați același proces dacă aplicația este distrusă, depășind activitatea acesteia onDestroy
metodă:
@Override protejat void onDestroy () stopService (playIntent); musicSrv = null; super.onDestroy ();
Când rulați aplicația în acest moment, veți putea să redați melodii selectându-le din listă și să ieșiți din aplicație utilizând Sfârșit buton.
Am implementat acum redarea de bază a pieselor muzicale selectate din lista de fișiere muzicale a utilizatorului. În ultima parte a acestei serii, vom adăuga un controler media prin care utilizatorul va putea controla redarea. Vom adăuga o notificare pentru a permite utilizatorului să revină la aplicație după ce se va îndepărta de ea și vom efectua unele menajuri pentru ca aplicația să facă față unei varietăți de acțiuni ale utilizatorilor.