Android Media Player: inicio llamado en estado de error 4(-38,0)
android-asynctask media-player (3)
Este es el código que estoy usando para obtener dinámicamente un nombre de archivo (.mp3) de alguna otra clase, ya que tengo muchos archivos mp3 en mi carpeta de activos:
playAudioButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
FileName audio=new FileName();
String audioName=audio.getAudioName(count).toString();
if(audioName=="NO Audio")
{
Toast.makeText(getApplicationContext(), "No Audio for this page", Toast.LENGTH_SHORT).show();
}
else
{
try {
afd=getAssets().openFd(audioName + ".mp3");
mp = new MediaPlayer();
mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
mp.prepareAsync();
mp.start();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
}
Gato de registro:
03-20 11:21:28.726: E/SpannableStringBuilder(4418): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-20 11:21:28.726: E/SpannableStringBuilder(4418): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-20 11:22:24.968: D/libEGL(4579): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
03-20 11:22:24.976: D/libEGL(4579): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
03-20 11:22:24.984: D/libEGL(4579): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
03-20 11:22:25.070: D/OpenGLRenderer(4579): Enabling debug mode 0
03-20 11:22:38.773: E/MediaPlayer(4579): start called in state 4
03-20 11:22:38.773: E/MediaPlayer(4579): error (-38, 0)
03-20 11:22:38.773: E/MediaPlayer(4579): Error (-38,0)
Puntos a tener en cuenta: 1. He comprobado subprocesos similares en el desbordamiento de pila, la respuesta es usar prepareAsync () 2. He usado prepareAsync ()
Gracias por adelantado.
En lugar de utilizar este método MediaPlayer
preparedSync/prepare
de MediaPlayer
, puede pasar la ruta del archivo que se convierte en URI al MediaPlayer.create()
MediaPlayer mediaPlayer = MediaPlayer.create(context, URI.parse("file://"+filePath));
Esto lo preparará y comenzará a jugarse.
Otra forma es usar onPrepareListener()
de MediaPlayer
y luego comenzar a jugar
Estado 4 significa que Mediaplayer está en estado de preparación.
y llamamos a otras acciones como
Mediaplayer.start()
Mediaplayer.stop()
Mediaplayer.pause()
o cualquier otra cosa.
Según su código es Mediaplayer.start();
necesitas escribir el método onprepare
MediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.start();
}
});
Una vez llamado el método Onprepared (), puedes hacer un proceso adicional
solo quita
mp.start()
después
mp.prepareAsync();
Y te iras bien
También puede usar el método onPrepared()
para llamar al método de inicio, de modo que se llame a start()
después de que se haya preparado MediaPlayer
.
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.start();
}
});