android android-asynctask media-player android-assets

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(); } });