2013-03-20 14 views
18

Questo è il codice che sto usando per recuperare un nome file (.mp3) dinamicamente da qualche altra classe poiché sto avendo molti file mp3 nella mia cartella delle risorse:Media Player Android: Inizia chiamato in stato 4 errore (-38,0)

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




      } 
     }); 


    } 

Log Cat:

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) 

Punti da notare: 1. ho controllato le discussioni simili in caso di overflow dello stack la risposta sta usando prepareAsync() 2. ho usato prepareAsync()

Grazie in anticipo.

risposta

19

È anche possibile utilizzare il metodo onPrepared() per richiamare il metodo di avvio in modo da t start() viene chiamato dopo che è stato preparato MediaPlayer.

mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      // TODO Auto-generated method stub 

      mp.start(); 

     } 
    }); 
+3

Sto usando questo, ma ancora ottenere questo errore. – WideFide

2

Invece di utilizzare questo metodo di MediaPlayerpreparedSync/prepare si può semplicemente passare il percorso del file conversione in URI al MediaPlayer.create()

MediaPlayer mediaPlayer = MediaPlayer.create(context, URI.parse("file://"+filePath)); 

questo prepararlo e iniziare a giocare per sé

Oppure un altro modo è quello di utilizzare onPrepareListener() di MediaPlayer e da questo in poi è possibile iniziare a giocare

0

stato 4 significa Mediaplayer è nella preparazione dello stato

e chiediamo altre azioni come

Mediaplayer.start() 
Mediaplayer.stop() 
Mediaplayer.pause() 

o qualsiasi altra cosa.

Come per il codice che è Mediaplayer.start();

è necessario scrivere onprepare metodo

MediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      // TODO Auto-generated method stub 
      mp.start(); 
     } 
    }); 

Una volta che il metodo Onprepared() chiamata si può fare ulteriore processo

sufficiente rimuovere

mp.start() 

dopo

mp.prepareAsync(); 

E sarai buona per andare