Creați un player de muzică pe Android redarea melodiilor

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

Căutați o soluție rapidă?

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 Player

Sau, 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.

Introducere

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.

1. Creați un serviciu

Pasul 1

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;

Pasul 2

Adăugați următoarele variabile de instanță la noul Serviciu clasă:

// media player MediaPlayer privat; // lista de melodii private ArrayList câ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 ();

Pasul 3

Este timpul să adăugați o metodă la Serviciu clasa pentru a trece lista de melodii de la Activitate:

public void setList (ArrayList Songs) 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ă.

2. Porniți serviciul

Pasul 1

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

Pasul 2

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.

3. Începeți redarea

Pasul 1

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

Pasul 2

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

Pasul 3

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.

Concluzie

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.

Cod