我有一个应用程序,打开后可以播放音乐。但当我停止音乐并使用后退按钮时,我会收到一个异常,应用程序会强制关闭。这是我的代码:
@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();
}
}
这是我的日志:
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语句,但它也不起作用。
在BackPressed()上使用如下代码
AudioManager.isMusicActive()
完成您想要的工作,请仔细查看此处了解详细信息:AudioManager
这里有一个例子:
AudioManager manager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
if(manager.isMusicActive())
{
// do something - or do it not
}
在MediaPlayer
上调用release()
之后调用isPlaying()
是无效的。
按下停止按钮后释放它,然后在onBackPressed()
中调用isPlaying()
,这将导致IllegalStateException
。只有当你完全不想用Mediaplayer
做其他事情时,你才应该打电话给release()
根据文件:
在使用完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()
的调用,您将遇到这样的问题。