2013-06-12 10 views
34

Sono un principiante della programmazione Android e mi piacerebbe imparare come utilizzare il metodo soundpool, ho eseguito delle ricerche su di esso ma tutto ciò che ho trovato sembra non facile da capire! Mi piacerebbe che tu mi mostri un esempio molto semplice che esegue 2 suoni.Riproduci suono utilizzando l'esempio Soundpool

risposta

48

1.Creare 1 cartella denominata come grezzo sotto YourApp/res/

2.Do copiare e incollare la suoneria in questa cartella

per la comprensione approfondita controllare questo Tutorial 1 e Tutorial 2

SoundPool sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0); 

/** soundId for Later handling of sound pool **/ 
int soundId = sp.load(context, R.raw.windows_8_notify, 1); // in 2nd param u have to pass your desire ringtone 

sp.play(soundId, 1, 1, 0, 0, 1); 

MediaPlayer mPlayer = MediaPlayer.create(context, R.raw.windows_8_notify); // in 2nd param u have to pass your desire ringtone 
//mPlayer.prepare(); 
mPlayer.start(); 

È anche possibile impostare l'ascoltatore

sp.setOnLoadCompleteListener(new OnLoadCompleteListener() 
{ 
    @Override 
    public void onLoadComplete(SoundPool soundPool, int sampleId,int status) { 

} 
}); 

Per il controllo lecca-lecca @ utente3833732 risposta.

+0

La ringrazio molto .. –

+10

Il costruttore Soundpool è deprecato ora, ma dal momento che richiede SoundPool.Builder livello di API 21, credo di essere ancora usando. – Noumenon

+0

Le ultime due righe (la cosa MediaPlayer) non sono necessarie. Per il resto, è stato utile. Grazie :) – voghDev

44

Sì. Ho passato anche questo. ma per sicurezza ho salvato un pezzo di codice che ho trovato online. Anche se havent usato, so che sarà utile presto ...

1) È necessario creare AudioAttributes oggetto:

AudioAttributes attributes = new AudioAttributes.Builder() 
    .setUsage(AudioAttributes.USAGE_GAME) 
    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) 
    .build(); 

2) Creare Soundpool oggetto:

SoundPool sounds = new SoundPool.Builder() 
    .setAudioAttributes(attributes) 
    .build(); 

3) Come utilizzare SoundPool su tutti i livelli API esempio:

SoundPool sound; 

protected void createSoundPool() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     createNewSoundPool(); 
    } else { 
     createOldSoundPool(); 
    } 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
protected void createNewSoundPool(){ 
    AudioAttributes attributes = new AudioAttributes.Builder() 
     .setUsage(AudioAttributes.USAGE_GAME) 
     .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) 
     .build(); 
    sounds = new SoundPool.Builder() 
     .setAudioAttributes(attributes) 
     .build(); 
} 

@SuppressWarnings("deprecation") 
protected void createOldSoundPool(){ 
    sounds = new SoundPool(5,AudioManager.STREAM_MUSIC,0); 
} 
+0

Nota: si desidera un .setMaxStreams (5) sul Builder in createNewSoundPool anche se si desidera avere lo stesso comportamento, per riprodurre più suoni contemporaneamente, come in quello precedente. Anche il 5 potrebbe essere un int finale o qualcosa del genere. –

4

Ho scritto un SoundPoolManager che può essere utilizzato per caricare file audio e riprodurre come e quando richiesto. Potete vederlo here.

Grazie.

+1

il codice dell'articolo non è leggibile –

+0

Cosa intendi per illeggibile? –

+1

Trovo leggibile il codice SoundPoolManager, ma il vantaggio dell'utilizzo di int invece di SoundPool non mi è chiaro. Immagino che sia per comodità. Sarebbe utile se lo spiegassi più pienamente. SoundPoolManager risponde alle carenze di SoundPool, rende il mio codice più sicuro/più portabile/più gestibile/più efficiente? Se sì, come e perché? Grazie in anticipo. –

1

Ecco un piccolo, lavorando esempio soundPool, è preso dal here e leggermente modificato per corrispondere alberino API 21.

Una cosa da notare è maxStreams, che indica quanti stream possono essere eseguiti in parallelo, se è uno (predefinito), può essere rimosso dal builder.

import android.app.Activity; 
import android.content.Context; 
import android.media.AudioManager; 
import android.media.SoundPool; 

public class SoundManager extends Activity 
{ 
    static SoundPool soundPool; 
    static int[] sm; 
    static AudioManager amg; 


    public static void InitSound() { 

    int maxStreams = 1; 
    Context mContext = getApplicationContext(); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     soundPool = new SoundPool.Builder() 
       .setMaxStreams(maxStreams) 
       .build(); 
    } else { 
     soundPool = new SoundPool(maxStreams, AudioManager.STREAM_MUSIC, 0); 
    } 

    sm = new int[3]; 
    // fill your sounds 
    sm[0] = soundPool.load(mContext, R.raw.sound_1, 1); 
    sm[1] = soundPool.load(mContext, R.raw.sound_2, 1); 
    sm[2] = soundPool.load(mContext, R.raw.sound_3, 1); 

    amg = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); 
    } 

    static void playSound(int sound) { 

     soundPool.play(sm[sound], 1, 1, 1, 0, 1f); 
    } 

    public final void cleanUpIfEnd() { 
    sm = null; 
    soundPool.release(); 
    soundPool = null; 
    } 
} 
+1

'amg' non viene utilizzato – FracturedRetina

+0

Viene utilizzato in' init' – Idan

+0

Inizializzato ma mai utilizzato. – m0skit0

Problemi correlati