Android 为什么MediaPlayer强制关闭我的应用程序?
我试图制作一个倒计时计时器,当它达到0时播放声音,但每当它试图播放声音时,它就会强制关闭。我很确定我的代码是正确的,但我不明白为什么它会关闭。请帮忙,为什么这个力会关闭Android 为什么MediaPlayer强制关闭我的应用程序?,android,android-mediaplayer,Android,Android Mediaplayer,我试图制作一个倒计时计时器,当它达到0时播放声音,但每当它试图播放声音时,它就会强制关闭。我很确定我的代码是正确的,但我不明白为什么它会关闭。请帮忙,为什么这个力会关闭 import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.media.MediaPlaye
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.Chronometer.OnChronometerTickListener;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
Button start, stop;
int minCount, secCount;
Chronometer count;
boolean viberate, running;
SharedPreferences getPrefs;
MediaPlayer alarm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initilize();
count.start();
count.setOnChronometerTickListener(new OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
if (running) {
secCount--;
updateDisplay();
}
}
});
start.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
running = true;
alarm.release();
if (minCount <= 0 && secCount <= 0) {
nothing();
}
}
});
stop.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
running = false;
}
});
protected void done() {
// TODO
boolean music = getPrefs.getBoolean("Sound", true);
if (music && alarm != null) {
alarm.start(); //line 179 this is the line that causes the force close
}
running = false;
Toast.makeText(this, "Times Up!!!", Toast.LENGTH_LONG).show();
}
private void initilize() {
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.stop);
second = (TextView) findViewById(R.id.second);
minute = (TextView) findViewById(R.id.minute);
minCount = 1;
secCount = 0;
count = (Chronometer) findViewById(R.id.chronometer1); running = false;
getPrefs = PreferenceManager
.getDefaultSharedPreferences(getBaseContext());
alarm = MediaPlayer.create(MainActivity.this, R.raw.finished);
}
private void updateDisplay() {
if (minCount <= 0 && secCount <= 0) {
done();
}
if (secCount < 0) {
minCount--;
secCount = 59;
}
if (secCount < 0) {
secCount = 59;
second.setText("59");
} else if (secCount <= 9) {
second.setText("0" + secCount + "");
} else {
second.setText(secCount + "");
}
if (minCount < 0) {
minCount = 59;
minute.setText("59 :");
} else if (minCount <= 9) {
minute.setText("0" + minCount + " :");
} else {
minute.setText(minCount + " :");
}
}
@Override
protected void onStop() {
super.onStop();
alarm.release();
}
}
您有一个非法状态异常,但代码看起来很好
alarm = MediaPlayer.create(MainActivity.this, R.raw.finished);
请确保已完成的流不是非法格式。尝试使用
try {
alarm.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
当您将数据源设置为mediaplayer时,如果强制关闭,LogCat会进行堆栈跟踪。您应该编辑您的问题以添加LogCat输出。
music==true
应该是if(music)
不要使用=
boolean@codeMagic您可以将==
与布尔值一起使用,只是不使用==
是惯例。是的,我知道,但在大多数情况下,坚持惯例是最好的。我不是说这是问题所在,也不是说它会被贴出来作为答案,我只是给出了一些有用的答案advice@codeMagic,我知道我只是想知道为什么,因为有时候我会用它。但是谢谢A--C给出了答案。你能解释一下你说的“确保你的流完成不是非法格式”是什么意思吗@原始文件夹中的lazynijafinished.mp3或finished.wav。它是android支持的文件吗?试着用工作文件替换它,以确保安全。
try {
alarm.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}