这是我的源代码
private MediaPlayer mP;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mP = MediaPlayer.create(getApplicationContext(),R.raw.nintendo);
}
@Override
protected void onResume() {
super.onResume();
try {
mP.prepareAsync();
} catch (IllegalStateException e) {
e.printStackTrace();
}
mP.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mP.seekTo(0);
mP.start();
}
});
}
@Override
protected void onPause() {
super.onPause();
mP.stop();
mP.release();
}
这是我在尝试运行时在Logcat中获得的内容
第64行:mP.stop();
当我按照以下顺序执行此Logcat输出时, 启动 - >主屏幕 - >返回应用 - >主屏幕
现在我知道当您尝试执行无效的状态更改时会发生IllegalStateException。从http://developer.android.com/reference/android/media/MediaPlayer.html开始,我知道有效的状态变化将来自“开始停止”或“停止停止”。我认为我的代码中的逻辑表示有效的状态更改(从onPause开始到onPause中的停止/释放)。 我进一步调试并意识到,在我进入主屏幕并返回应用程序之后,onPrepared没有被调用....我不明白这是因为我之前调用了mP.prepareAsync()(异步以避免阻止这个主要的ui线程)之前。在收集完所有声音资源后,是否应该触发准备?
我查了几个其他主题 不可能是这个Android Media Player,因为我构建了MediaPlayer。 再次,android MediaPlayer not playing mp3 file没有解决我的问题,因为我构建的MediaPlayer很好,它在我第一次启动应用程序时播放了声音。
是否有人发现此代码存在问题?
答案 0 :(得分:1)
首先,请勿使用prepareAsync()
在使用MediaPlayer.create()
创建的MediaPlayer上致电prepare()
,因为MediaPlayer
会照顾您。
来自文档:
http://developer.android.com/reference/android/media/MediaPlayer.html
MediaPlayer.onCreate()...
为给定资源ID创建MediaPlayer的便捷方法。上 成功,prepare()已经被调用,绝不可以 再次打电话。
由于您要在onPause()
中发布onResume()
,如果您想在MediaPlayer
中重播,则必须创建新的MediaPlayer.onCreate()
1}}使用onPause()
。
我建议您不要在mP.pause()
中发布MediaPlayer,拨打mP.stop()
而不是MediaPlayer
,然后您就不必担心重新创建/准备onResume()
中的private MediaPlayer mMediaPlayer;
private boolean mIsPrepared;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMediaPlayer = MediaPlayer.create(this, R.raw.raw1);
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mIsPrepared = true;
}
});
}
@Override
protected void onResume() {
super.onResume();
if (mMediaPlayer != null && mIsPrepared) {
mMediaPlayer.seekTo(0);
mMediaPlayer.start();
}
}
@Override
protected void onPause() {
super.onPause();
if(mMediaPlayer!=null && mIsPrepared){
mMediaPlayer.pause();
}
}
。
以下是一个例子:
{{1}}