2014-09-30 151 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

相关问题