gpt4 book ai didi

java - 为什么 MediaPlayer.start 不从零开始播放?

转载 作者:行者123 更新时间:2023-11-30 02:31:58 26 4
gpt4 key购买 nike

这是我的源代码

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 中得到的内容 enter image description here enter image description here

第 64 行:mP.stop();

当我执行以下序列时,会出现此 Logcat 输出,启动 -> 主屏幕 -> 返回应用 -> 主屏幕

现在我知道当您尝试进行无效的状态更改时会发生 IllegalStateException。来自,http://developer.android.com/reference/android/media/MediaPlayer.html ,我知道有效的状态变化是从“开始到停止”或“停止到停止”。我认为我的代码中的逻辑代表了一个有效的状态变化(从 onPause 开始到 onPause 停止/释放)。我进一步调试了一下,意识到在我进入主屏幕并返回应用程序后,没有调用 onPrepared ....我也不明白这一点,因为我事先调用了 mP.prepareAsync() (异步以避免阻止这个主要的用户界面线程)。 onPrepared 不是应该在所有的声音资源都收集完之后才触发吗?

我检查了一些其他线程不可能是这个Android Media Player因为我构建了 MediaPlayer 很好。又在这里 android MediaPlayer not playing mp3 file没有解决我的问题,因为我构建的 MediaPlayer 很好,它在我第一次启动应用程序时播放了声音。

有人看到这段代码有问题吗?

最佳答案

首先,不要在使用 MediaPlayer.create() 创建的 MediaPlayer 上调用 prepareAsync(),因为 prepare() 为您服务。

来自文档:

http://developer.android.com/reference/android/media/MediaPlayer.html

MediaPlayer.onCreate()...

Convenience method to create a MediaPlayer for a given resource id. On success, prepare() will already have been called and must not be called again.

因为你在 onPause() 中释放你的 MediaPlayer,如果你想在 onResume() 中再次播放,你是必须使用 MediaPlayer.onCreate() 创建一个新的 MediaPlayer

我建议你不要在onPause()中释放MediaPlayer,调用mP.pause()而不是mP.stop(),然后您就不必担心在 onResume() 中重新创建/准备 MediaPlayer

这是一个例子:

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();
}
}

关于java - 为什么 MediaPlayer.start 不从零开始播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27219857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com