Tengo una aplicación de Android con un solo botón. Cuando se hace clic en el botón, la aplicación comienza a reproducir (en bucle) el sonido cargado con SoundPool. Cuando se vuelve a hacer clic en el botón, el sonido se detiene y luego comienza de nuevo.
Pero el problema es que el sonido se reproduce solo cada dos veces.
Cuando el sonido no se reproduce, aparece este error en el logcat:
E/AudioTrack: AudioFlinger could not create track, status: -12 E/SoundPool: Error creating AudioTrackCuando elimino el bucle (cambio -1 a 0), ¡todo funciona completamente bien!
El sonido que estoy reproduciendo es un archivo MP3, tamaño 71,6 KiB.
He probado esto en Sony Xperia U, con Android 4.1.2 (no funciona). Pero en mi Huawei Honor 6 (Android 6.0) todo funciona, ¡incluso el bucle!
¿Qué estoy haciendo mal?
Aquí está mi código:
import android.media.AudioManager; import android.media.SoundPool; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { private int lastStreamId = 0; private int soundID; private SoundPool soundPool; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); soundID = soundPool.load(this, R.raw.sound01, 1); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { soundPool.stop(lastStreamId); lastStreamId = soundPool.play(soundID, 1, 1, 1, -1, 1); } }); } }EDITAR:
No tengo permitido subir el sonido original aquí, pero aquí hay otro sonido que hace lo mismo. Excepto que ahora el sonido se reproduce solo en el primer clic ; todos los siguientes clics simplemente lo silencian y escupen el error anterior.
El sonido está aquí: sound01.mp3
Como puede ver aquí , el código de error 12 significa Out of memory en el entorno Linux. Aparentemente, son algunos problemas relacionados con la asignación de memoria en dispositivos Jelly Bean (supongo que para dispositivos pre-lollipop).
Reduje la muestra de su archivo original de 177808 kbps a 32000 kbps, y comenzó a funcionar como se esperaba en los dispositivos anteriores a la piruleta.
Por lo tanto, debe reducir la muestra de su archivo de audio para dispositivos anteriores a la piruleta. Es mejor tener un raw-v21 para archivos de audio originales, y ponerlos en formato raw . Por lo tanto, los dispositivos a partir de API 21 utilizarán la versión original.
Aquí está el archivo reducido.
Tuve el mismo problema. Haz lo siguiente:
(1) asegúrese de que sus archivos tengan menos de 1 MB
(2) lo que es más importante, libere sus instancias de SoundPool después de usarlas para liberar espacio en la memoria
soundPool.release();