2014-09-30 150 views
0

我有一個應用程序,打開時播放音樂。但是,當我停止音樂,並使用後退按鈕,我得到一個例外和應用程序關閉。這是我的代碼:應用程序按後退按鈕後拋出一個異常

@Override 
protected void onCreate(Bundle SavedInstanceState) { 
    super.onCreate(SavedInstanceState); 
    setContentView(R.layout.media_player_layout); 
    final Uri uri = getIntent() != null ? getIntent().getData() : null; 
    final SharedPreferences premiumSettings = getSharedPreferences("PREMIUM", Context.MODE_PRIVATE); 
    final boolean isPremium = premiumSettings.getBoolean("isPremium", false); 
    Button play = (Button) findViewById(R.id.play); 
    Button stop = (Button) findViewById(R.id.stop); 
    if (isPremium) { 
     musicPlayer = MediaPlayer.create(MusicPlayer.this, uri); 
     musicPlayer.start(); 


     play.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if(musicPlayer.isPlaying()){ 
        musicPlayer.pause(); 
       } 
       else {musicPlayer = MediaPlayer.create(MusicPlayer.this, uri); 
       musicPlayer.start(); 
      }} 
     }); 
     stop.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (musicPlayer.isPlaying()) { 
        musicPlayer.stop(); 
        musicPlayer.release(); 
       } 
      } 
     }); 
     Button exit = (Button) findViewById(R.id.exit); 
     exit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (musicPlayer != null && musicPlayer.isPlaying()) { 
        musicPlayer.stop(); 
        musicPlayer.release(); 
        musicPlayer = null; 
        finish(); 
       } 
      } 
     }); 
    } 
    else { 
     AlertDialog.Builder builder = new AlertDialog.Builder(MusicPlayer.this); 
     builder.setTitle("Error"); 
     builder.setMessage("You are not premium user. Please enter the promocode or buy the full version"); 
     builder.setIcon(R.drawable.holo_dark_action_info); 
     builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       finish(); 
      } 
     }); 
     AlertDialog dialog = builder.create(); 
     dialog.show(); 
    }} 
    public void onBackPressed() { 
     if(musicPlayer.isPlaying()) { 
      musicPlayer.stop(); 
      musicPlayer.release(); 
     } 
      musicPlayer = null; 
     finish(); 
} 
} 

,這是我的logcat:

09-30 18:00:33.106 23141-23141/com.tproductions.Openit E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.tproductions.Openit, PID: 23141 
    java.lang.IllegalStateException 
      at android.media.MediaPlayer.isPlaying(Native Method) 
      at com.tproductions.Openit.MusicPlayer.onBackPressed(MusicPlayer.java:76) 

我怎樣才能使它的工作?我已經嘗試了if-else語句,但它也不起作用。

+0

檢查onbackpressed isPlaying() – 2014-09-30 16:10:58

+0

時檢查天氣有錯誤但它沒有工作,即使沒有if-else – Trabefi 2014-09-30 16:11:52

+0

你可能只是發現異常。 – njzk2 2014-09-30 16:12:50

回答

0

這是不在MediaPlayer上撥打release()後,您可以致電isPlaying()

您點擊停止按鈕後釋放它,然後在onBackPressed()中撥打isPlaying() - 這會導致您的IllegalStateException。您應該只調用release()時也絕對沒有別的你想要做你的Mediaplayer

按照docs:

它被認爲是很好的做法,當你使用的MediaPlayer完成調用此方法。

然而,在這種情況下,你還沒有完成它。

要修復,刪除以下調用release()

stop.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     if (musicPlayer.isPlaying()) { 
      musicPlayer.stop(); 
      // musicPlayer.release(); <- remove this 
     } 
    } 
}); 

作爲一個側面說明,它是簡單到只需調用release()一次在您的活動的生命週期方法,如在onStop()onPause()。如果你用release()調用你的代碼,你會遇到這樣的問題。

1

下面的代碼使用像onBackPressed()

AudioManager.isMusicActive()做你想要的工作,必須仔細看看這裏的細節:AudioManager

這裏有一個例子:

AudioManager manager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE); 
if(manager.isMusicActive()) 
{ 
    // do something - or do it not 
} 
+0

ckeck它,並告訴我它適用於你或沒有 – 2014-09-30 16:16:55

+0

好吧,要檢查tomorow好嗎? – Trabefi 2014-09-30 16:21:10

相關問題