Sunet de programare în Android - soundpool și mediaplayer

Gestionarea sunetului Android

Cum se joacă sunetul prin SoundPool

Să scriem o aplicație care va reda sunetul când atingeți ecranul. Creați un nou proiect numit CrazySong, pachetul va fi apelat






ru.mobilab.crazysong, ca activitate principală, indicăm CrazySongActivity.

Aici este main.xml la formular


Să ne uităm la secvența de acțiuni care trebuie efectuate pentru a reproduce fișierul de sunet. Mai întâi de toate, trebuie să creăm un obiect soundPool. Constructorul său are mai mulți parametri. Primul parametru specifică numărul maxim de fișiere simultan redate. Al doilea parametru specifică tipul fluxului audio. În majoritatea cazurilor, valoarea soundPool STREAM_MUSIC este adecvată, deși sunt posibile și alte fluxuri audio. Numirea lor este destul de evidentă. (STREAM_ALARM, STREAM_DTMF, STREAM_NOTIFICATION, STREAM_RING, STREAM_SYSTEM, STREAM_VOICE_CALL). Al treilea parametru specifică rata de eșantionare. În prezent, nu afectează nimic, deci aici am stabilit 0.

Odată ce am stabilit o facilitate pentru Soundpool, folosind setOnLoadCompleteListener adaugă la ea OnLoadCompleteListener, care va urmări descărcarea este finalizată. Ca parametri, metoda onLoadComplete ia un obiect SoundPool, numărul eșantionului încărcat și starea de finalizare a operației. În cazul în care totul a mers bine, statutul este zero.

Pentru a reda eșantionul, utilizați metoda de redare, care are următorii parametri:

  • soundID variabilă cu numărul eșantionului. Acest număr este returnat ca urmare a metodei de încărcare.
  • value leftVolume a volumului canalului stâng (de la 0,0 la 1,0)
  • rightVolume valoarea volumului canalului drept (de la 0.0 la 1.0)
  • prioritate prioritate a firului (0 este cea mai mică prioritate)
  • bucla de câte ori trebuie să repetați eșantionul (0 nu repetați, -1 - buclă)
  • viteza de redare a vitezei (poate varia de la 0,5 la 2,0, 1 - viteza normala)







Ca urmare a metodei de redare, numărul de fluxID (sau 0 în caz de eroare) este returnat, care poate fi utilizat pentru a controla redarea. De exemplu, această valoare este utilizată atunci când apelați metodele pauză și reluați, opriți, setVolume, setLoop. Dacă numărul de fișiere maxim redate este depășit, atunci apelarea următoarei metode de redare va duce la terminarea redării unuia dintre eșantioanele redate în mod curent.

Codul nostru de clasă este prezentat mai jos.
pachet ru.mobilab.crazysong;

SoundPool și scurgere de memorie

Pe forum există rapoarte că folosirea lui SoundPool provoacă o problemă de scurgere a memoriei. Un fel de informații coerente și verificate cu privire la această problemă nu au putut fi găsite. Dacă nu veți mai juca sunete, se recomandă rularea codului

Redați muzică de fundal pe Android folosind MediaPlayer

În cazul în care intenționați să descărcați fișierul de pe Internet, secvența de acțiuni va fi puțin diferită. Nu este nevoie să utilizați metoda de creare. Sursa de date audio este setată folosind metoda setDataSource, după care trebuie să apelați pregăti (), care blochează firul până când media player-ul este gata să redea muzică. Metoda prepareAsync () efectuează aceleași acțiuni în modul asincron, adică nu blochează firul care a cauzat-o. Dacă utilizați prepareAsync, trebuie să utilizați OnPreparedListener pentru a determina când MediaPlayer este gata să redea fișierul. Rețineți că atunci când utilizați metoda de creare, nu este necesar să apelați metoda de pregătire, deoarece se numește în interiorul crea.

Mai era o întrebare urgentă: cum să determinăm că redarea fișierului sa încheiat? În acest scop, se folosește funcția de apel invers. Pentru a le lega la playerul nostru media, trebuie să executați următorul cod:

Asta e tot. Reproducerea sunetului nu este un subiect atât de dificil. Arhiva cu proiectul pe care îl puteți descărca aici.







Trimiteți-le prietenilor: