para - La forma correcta de jugar sonidos cortos Android?
sonidos de animales domesticos (3)
Estoy creando una aplicación que tendrá múltiples imágenes en la pantalla, estas imágenes serán botones y cuando toque 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.
El código que estoy usando para reproducir mi sonido es este:
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 de retraso también podría deberse a la forma en que estoy usando el objeto del reproductor de medios. 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 que descubrí Sound Pool, edité mi código para usarlo y funciona perfectamente, el nuevo código se ve así:
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
@Rikonator está en el camino correcto allí con Soundpool. Es mucho más adecuado para el tipo de funcionalidad que buscas.
Sin embargo, si decides usar el reproductor de medios de todos modos, no olvides el método prepareAsync () para evitar que cuelgue el subproceso de UI. Puedes leer más sobre jugar en los medios here .
Puedes usar SoundPool
. Se ajusta perfectamente a lo que quieres hacer.
Solo necesitará una forma de almacenar los ID de efectos de sonido correspondientes a cada imagen (o botón).
Tal vez extienda el botón para almacenar 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.
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();
}