2013-10-14 10 views
10
public static MediaPlayer mp=null; 
public static void playGeneric(int name, final ImageButton button,final ImageButton pervious,Context context) { 
    button.setEnabled(false); 
button.setClickable(false); 
pervious.setEnabled(false); 
pervious.setClickable(false); 
    try{ 
     if(mp != null && mp.isPlaying()) 
     { 
      mp.stop(); 
      mp.release(); 
      mp = null; 
      mp=MediaPlayer.create(context, name); 
      mp.start(); 
     } 
     else 
     { 
      mp = MediaPlayer.create(context, name); 
      mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
       @Override 
       public void onPrepared(MediaPlayer arg0) { 
        //mp.prepare(); 
        mp.start(); 

       } 

      }); 
     mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer mp) { 
       // TODO Auto-generated method stub 
       mp.release(); 
       System.out.println("Object released"); 
       button.setEnabled(true); 
       button.setClickable(true); 
       pervious.setEnabled(true); 
       pervious.setClickable(true); 
      } 
     }); 
     } 

    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     e.getMessage(); 
    } catch (NullPointerException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     e.getMessage(); 
    } 

} 

mi danno java.lang.IllegalStateException().java.lang.IllegalStateException in MediaPlayer.isplaying() metodo

Voglio interrompere la musica se è in esecuzione e riprodurre un altro brano uno dopo l'altro.

logcat:

10-14 15:12:05.474: E/MediaPlayer(15411): prepareAsync called in state 8 
10-14 15:12:05.474: W/System.err(15411): java.lang.IllegalStateException 
10-14 15:12:05.474: W/System.err(15411): at android.media.MediaPlayer.prepare(Native Method) 
10-14 15:12:05.474: W/System.err(15411): at com.rogerscenter.LearnReadWriteSpell.Utility.Music.playGeneric(Music.java:93) 
10-14 15:12:05.474: W/System.err(15411): at com.rogerscenter.LearnReadWriteSpell.LetterCategory.Letter_Lesson1_activity.onCreate(Letter_Lesson1_activity.java:140) 
10-14 15:12:05.474: W/System.err(15411): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
10-14 15:12:05.474: W/System.err(15411): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586) 
10-14 15:12:05.474: W/System.err(15411): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638) 
10-14 15:12:05.474: W/System.err(15411): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
10-14 15:12:05.474: W/System.err(15411): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928) 
10-14 15:12:05.484: W/System.err(15411): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-14 15:12:05.484: W/System.err(15411): at android.os.Looper.loop(Looper.java:123) 
10-14 15:12:05.484: W/System.err(15411): at android.app.ActivityThread.main(ActivityThread.java:3647) 
10-14 15:12:05.484: W/System.err(15411): at java.lang.reflect.Method.invokeNative(Native Method) 
10-14 15:12:05.484: W/System.err(15411): at java.lang.reflect.Method.invoke(Method.java:507) 
10-14 15:12:05.484: W/System.err(15411): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
10-14 15:12:05.484: W/System.err(15411): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
10-14 15:12:05.484: W/System.err(15411): at dalvik.system.NativeStart.main(Native Method) 
+1

si prega di inviare completa analisi dello stack –

risposta

7

Come docs Android suggerire che se mp è se non è stato inizializzato in quel momento java.lang.IllegalStateException saranno gettati in modo da avere a initilize primo o si deve scrivere

check-out la documentazione http://developer.android.com/reference/android/media/MediaPlayer.html#isPlaying()

provare come questo

mp=MediaPlayer.create(context, name); 

    try { 

    if (mp.isPlaying()) { 
     mp.stop(); 
     mp.release(); 
     mp=MediaPlayer.create(context, name); 
    } 



    mp.start(); 
} catch (Exception e) { 
} 
+1

no non funziona (: – Sydroid

+0

potete inserire logcat dopo aver fatto cambiare quello che ho suggerito –

+0

dove poter postare logcat, i dnot so in pila sul flusso – Sydroid

7

Provare a cambiare mp.release() in reset(). quello potrebbe aiutarti.

+0

reset() non mi sta dando perfetto – Sydroid

+0

è funzionante per me :) –

-1

utilizzare runOnUiThread per mediaRegistrazione preparare.

private boolean prepareMediaRecorder() { 

    mediaRecorder = new MediaRecorder(); 

    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 

      mediaRecorder.reset(); 
      mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 

      mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); 

      mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

      mediaRecorder.setOutputFile(filePath); 

      try { 
       mediaRecorder.prepare(); 
      } catch (IOException e) { 
       mediaRecorder = null; 
       return; 
      } 
      mediaRecorder.start(); 
      recording = true; 
     } 
    }); 

    return true; 
} 
+0

Downvoting perché: (1) La domanda riguarda MediaPlayer, non MediaRecorder, (2) è abbastanza chiaro dal contesto del codice nella domanda che è in esecuzione sul thread dell'interfaccia utente, altrimenti l'altro codice (ad es. abilitazione e disabilitazione del controllo) che dipende dall'essere sul thread dell'interfaccia utente non funzionerà e (3) non è richiesto che MediaPlayer o MediaRecorder vengano utilizzati dal thread dell'interfaccia utente (devono essere * creati * su un thread con un Looper e quindi gli eventi verranno inviati tramite quel Looper, ma una volta creati possono essere utilizzati da altri thread). – Jules

Problemi correlati