2012-03-11 10 views
36

Estoy creando una aplicación que tendrá múltiples imágenes en la pantalla, estas imágenes serán botones y al tocar se reproducirá un sonido corto. Investigué esto y solo pude encontrar el método actual que estoy usando para reproducir sonidos, que no parece responder en absoluto. Quiero que el sonido suene rápido y responda a muchos golpes rápidos. No estaba seguro de si esto era posible en Android.¿La forma correcta de reproducir sonidos cortos es Android?

El código que estoy utilizando para jugar mi sonido es la siguiente:

Button sound1; 
MediaPlayer firstSound; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    firstSound = MediaPlayer.create(SoundActivity.this, R.raw.click); 


    sound1 = (Button) findViewById(R.id.Sound1); 


    beaver.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 

      firstSound.start(); 

      } 

    }); 



    } 

Mi problema lag también podría ser tal vez hasta la manera en que yo estoy usando el objeto reproductor multimedia? Siento que esto debería ser más suave en mi teléfono, cualquier sugerencia sobre cómo reproducir sonidos en Android es apreciada.

Gracias.

Desde el descubrimiento de sonido piscina, he editado mi código para utilizar este y funciona perfectamente, el nuevo código es el siguiente:

SoundPool soundPool; 
HashMap<Integer, Integer> soundPoolMap; 
int soundID = 1; 


Button sound1; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 


    soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100); 
    soundPoolMap = new HashMap<Integer, Integer>(); 
    soundPoolMap.put(soundID, soundPool.load(this, R.raw.click, 1)); 

    sound1 = (Button) findViewById(R.id.bBeaver); 


    sound1.setOnClickListener(new View.OnClickListener() { 

       public void onClick(View v) { 

        AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
       float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
       float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
       float leftVolume = curVolume/maxVolume; 
       float rightVolume = curVolume/maxVolume; 
       int priority = 1; 
       int no_loop = 0; 
       float normal_playback_rate = 1f; 
       soundPool.play(soundID, leftVolume, rightVolume, priority, no_loop, normal_playback_rate); 

      } 

    }); 


    } 

Gracias

+2

Parece que no está utilizando su carpeta de sonido de sonido? – Moberg

+1

amo la forma en que implementó, funcionó bien al mismo tiempo – desgraci

+0

Muchas gracias. ¡Funciona genial ...! –

Respuesta

25

Puede utilizar SoundPool. Se ajusta perfectamente a lo que quieres hacer.

Solo necesitará una forma de almacenar los ID de los efectos de sonido correspondientes a cada imagen (o botón).

Quizás extienda el botón para almacenar el ID de efecto de sonido asociado. Y use un SoundPool común para reproducir el efecto de sonido asociado a la identificación cuando se toca el botón.

You can read more about SoundPool here.

+1

Gracias por su consejo y enlace. Mire más a fondo esto y encontré un tutorial, esto me ayudó hacer lo que yo quería, sin duda es mucho mejor que el reproductor multimedia! Muchas gracias! – deucalion0

+0

¿Publicarías un enlace al tutorial? – Moberg

+0

@Moberg aquí tienes uno http://stackoverflow.com/questions/17069955/play- sound-using-soundpool-example –

3

@Rikonator está en el camino correcto con Soundpool. Es mucho más adecuado para el tipo de funcionalidad que buscas.

Si decide ir con el reproductor de medios de todos modos, no olvide el método prepareAsync() para evitar que cuelgue el subproceso de la interfaz de usuario. Puede leer más sobre la reproducción de medios here.

+1

Puede ser preferible bloquear el subproceso de la interfaz de usuario ya que los sonidos se utilizan para botones. Puede ser malo colgar la interfaz de usuario, pero los sonidos de activación tardía son un poco más extraños. – Tonithy

2
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sound); 

try { 
    if (mp.isPlaying()) { 
     mp.stop(); 
     mp.release(); 

     mp = MediaPlayer.create(getApplicationContext(), R.raw.sound); 
    } 

    mp.start(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
Cuestiones relacionadas