【问题标题】:Mediaplayer error (-19,0) after repeated plays重复播放后 Mediaplayer 错误 (-19,0)
【发布时间】:2012-04-10 22:10:09
【问题描述】:
我有一个游戏,当一个关卡完成时会播放声音。一开始一切正常,但在重复 10 或 20 次级别后,logcat 突然报告:
“MediaPlayer 错误 (-19,0)”和/或“MediaPlayer 在状态 0 中开始调用”并且不再发出声音。
我原本拥有的所有声音都是 mp3 格式的,但是在阅读了 ogg 可能更可靠之后,我将它们全部转换为 ogg,但出现的错误还是一样的。
知道如何解决这个问题吗?
【问题讨论】:
标签:
android
android-mediaplayer
【解决方案1】:
我遇到了同样的问题,我通过添加以下代码来释放播放器来解决它:
mp1 = MediaPlayer.create(sound.this, R.raw.pan1);
mp1.start();
mp1.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mp.release();
};
});
【解决方案2】:
我认为您没有发布用于播放声音的媒体播放器..
您需要 release() 媒体播放器,否则资源不会被释放,并且您很快就会耗尽内存(因为您下次再次分配它们)。所以,我认为你可以玩两次甚至三次......但不释放资源就不能玩很多次
【解决方案4】:
我解决了两个错误 (-19,0) 和 (-38,0) ,方法是每次在播放之前创建一个新的 MediaPlayer 对象并在之后释放它。
之前:
void play(int resourceID) {
if (getActivity() != null) {
//Using the same object - Problem persists
player = MediaPlayer.create(getActivity(), resourceID);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
player.release();
}
});
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
}
}
之后:
void play(int resourceID) {
if (getActivity() != null) {
//Problem Solved
//Creating new MediaPlayer object every time and releasing it after completion
final MediaPlayer player = MediaPlayer.create(getActivity(), resourceID);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
player.release();
}
});
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
}
}
【解决方案5】:
这是一个非常古老的问题,但它首先出现在我的搜索结果中,所以其他有相同问题的人最终可能会出现在这个页面上。
与其他人所说的不同,实际上您可以将 MediaPlayer 用于小声音,而无需使用大量内存。我将从我的音板应用中添加一些经过修改的片段,以向您展示我的意思。
private MediaPlayer mp;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
mp = new MediaPlayer();
}
private void playSound(int soundID){
mp.reset();
AssetFileDescriptor sound = getResources().openRawResourceFd(soundID);
try {
mp.setDataSource(sound.getFileDescriptor(),sound.getStartOffset(),sound.getLength());
mp.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mp.start();
}
按照我的设置方式,您可以在每次播放声音时重复使用的 MediaPlayer 对象上创建,这样就不会占用太多空间。
您调用 .reset() 而不是 .release() 因为 .release() 仅在您处理对象时使用,但是您想保留 MediaPlayer 对象。
您使用assetfiledescriptor 为您的媒体播放器设置一个新的声音文件来播放,而不是为您的媒体播放器地址设置一个新对象,因为这样您在方法中创建了未正确处理的新对象,您最终将运行进入与您描述的相同的错误。
这只是使用 MediaPlayer 的众多方法之一,但我个人认为,如果您只将它用于小型声音应用程序,它是最有效的。唯一的问题是它在你可以完成的事情上相对有限,但如果你确实将它用于小型声音应用程序,那应该不是什么大问题。
【解决方案6】:
我尝试删除模拟器和新创建模拟器以消除 (-19,0) 媒体播放器的错误。