2012-10-26 26 views
2

我爲Android做了/下載了一個運行良好的Java mediaplayer類,除了在屏幕超時或手動關閉時,在恢復時,我嘗試使用IllegalStateException mediaPlayer.isPlaying()還有一個mediaPlayer IllegalStateException:屏幕超時

使用谷歌搜索,我發現這可能是mediaplayer處於錯誤狀態。然後,我嘗試了try {...} catch(IllegalStateException...的事情,但是我加了太多,而事情正在失去控制(並且沒有成功)。

然後,我想是這樣:

mediaPlayer.setOnErrorListener(new OnErrorListener() { 
      public boolean onError(MediaPlayer mp, int what, int extra) { 
       mp.release(); 
       return false; 
      } 

,但它不工作,仍然得到IllegalStateException異常錯誤。 (編輯:BTW,here它說, 「IllegalStateExceptions不觸發OnErrorListener稱」 這是正確的?)。

所以,我的問題(S):

1)什麼是在屏幕上發生的事情使媒體播放器進入錯誤狀態的超時? 2)我怎樣才能防止這種情況發生? 3)我需要在mediaPlayer.setOnErrorListener中放置什麼? 4)我錯過了一些錯誤偵聽器,需要以某種方式處理它?

對不起...新手在這裏。

編輯:我被要求加入通話,所以這裏是整個類:

package com.floritfoto.apps.ave; 

import java.io.FileDescriptor; 
import java.io.IOException; 

import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.media.MediaPlayer.OnErrorListener; 

public class Music implements OnCompletionListener{ 
    MediaPlayer mediaPlayer; 
    boolean isPrepared = false; 

    public Music(FileDescriptor fileDescriptor){ 
     mediaPlayer = new MediaPlayer(); 
     try{ 
      mediaPlayer.setDataSource(fileDescriptor); 
      mediaPlayer.prepare(); 
      isPrepared = true; 
      mediaPlayer.setOnCompletionListener(this); 
      mediaPlayer.setOnErrorListener(new OnErrorListener() { 
       public boolean onError(MediaPlayer mp, int what, int extra) { 
        mp.release(); 
        return false; 
       } 
      }); 
     } catch(Exception ex){ 
      throw new RuntimeException("Couldn't load music, uh oh!"); 
     } 
    } 

    public void onCompletion(MediaPlayer mediaPlayer) { 
     synchronized(this){ 
      isPrepared = false; 
     }  
    }    

    public void play() { 
     if(mediaPlayer.isPlaying()){ 
      return; 
     } 
     try{ 
      synchronized(this){ 
       if(!isPrepared){ 
        mediaPlayer.prepare(); 
       } 
       mediaPlayer.seekTo(0); 
       mediaPlayer.start(); 
      } 
     } catch(IllegalStateException ex){ 
      ex.printStackTrace(); 
     } catch(IOException ex){ 
      ex.printStackTrace(); 
     } 
    } 

    public void stop() { 
     mediaPlayer.stop(); 
     synchronized(this){ 
      isPrepared = false; 
     }  
    }  

    public void switchTracks(){ 
     mediaPlayer.seekTo(0); 
     mediaPlayer.pause(); 
    } 

    public void pause() { 
     mediaPlayer.pause(); 
    } 

    public boolean isPlaying() { 
     return mediaPlayer.isPlaying(); 
    } 

    public boolean isLooping() { 
     return mediaPlayer.isLooping(); 
    } 

    public void setLooping(boolean isLooping) { 
     mediaPlayer.setLooping(isLooping); 
    } 

    public void setVolume(float volumeLeft, float volumeRight) { 
     mediaPlayer.setVolume(volumeLeft, volumeRight); 
    } 

    public String getDuration() { 
     return String.valueOf((int)(mediaPlayer.getDuration()/1000)); 
    } 
    public void dispose() { 
     if(mediaPlayer.isPlaying()){ 
      stop(); 
     } 
     mediaPlayer.release(); 
    } 
} 

這是錯誤:

E/AndroidRuntime(21110): FATAL EXCEPTION: main 
E/AndroidRuntime(21110): java.lang.RuntimeException: Unable to pause activity {com.floritfoto.apps.ave/com.floritfoto.apps.ave.OpenBird}: java.lang.IllegalStateException 
E/AndroidRuntime(21110):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2718) 
E/AndroidRuntime(21110):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2674) 
E/AndroidRuntime(21110):  at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2652) 
E/AndroidRuntime(21110):  at android.app.ActivityThread.access$800(ActivityThread.java:127) 
E/AndroidRuntime(21110):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1170) 
E/AndroidRuntime(21110):  at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(21110):  at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(21110):  at android.app.ActivityThread.main(ActivityThread.java:4507) 
E/AndroidRuntime(21110):  at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(21110):  at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(21110):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980) 
E/AndroidRuntime(21110):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) 
E/AndroidRuntime(21110):  at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(21110): Caused by: java.lang.IllegalStateException 
E/AndroidRuntime(21110):  at android.media.MediaPlayer.isPlaying(Native Method) 
E/AndroidRuntime(21110):  at com.floritfoto.apps.ave.Music.dispose(Music.java:101) 
E/AndroidRuntime(21110):  at com.floritfoto.apps.ave.OpenBird.onPause(OpenBird.java:211) 
E/AndroidRuntime(21110):  at android.app.Activity.performPause(Activity.java:4563) 
E/AndroidRuntime(21110):  at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1198) 
E/AndroidRuntime(21110):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2705) 
E/AndroidRuntime(21110):  ... 12 more 
W/ActivityManager(1864): Force finishing activity r.intent.getComponent().flattenToShortString() 
+0

你應該發佈整個調用棧 – nandeesh

回答

0

嘗試查看MediaPlayer的對空打電話之前isPlaying()用這個替換你的isPlaying()方法:

@Override 
public boolean isPlaying() 
{ 
    super.isPlaying(); 
if (mediaPlayer != null && mediaPlayer.isPlaying()) 
    return true; 
else 
    return false; 
} 
+0

是的,我試過了,但沒有奏效。 –

+0

實際上,我在同一行得到完全相同的錯誤,所以mediaPlayer似乎不是null。那麼,我需要刪除'@ Override'和'super.isPlaying();',因爲我得到了「方法必須重載超類方法」。 –

+0

我剛剛檢查過,如果我在播放時關閉屏幕,音樂會立即停止。也許這個信息有幫助? –

相關問題