我正在尝试制作类似音板的应用。现在我在第一次播放后重置后播放相同声音时遇到小问题。
final MediaPlayer SoundOne = MediaPlayer.create(this, R.raw.somesound);
final Button play_SoundOne = (Button) this.findViewById(R.id.play_SoundOne);
play_SoundOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SoundOne.start();
}
});
SoundOne.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
SoundOne.reset();
}
});
我可以获得帮助如何在复位后准备再次播放该声音(我重置为内存中为下一个声音腾出空间)但是如果我把它放在.start()之前,SoundOne.prepare()不起作用。有什么建议吗?
答案 0 :(得分:0)
调用getCurrentPosition(),getDuration(),getVideoHeight(),getVideoWidth(),setAudioAttributes(AudioAttributes),setLooping(boolean),setVolume(float,float),pause()等方法是一个编程错误,两种情况下,处于空闲状态的start(),stop(),seekTo(long,int),prepare()或prepareAsync()。如果在构造MediaPlayer对象后立即调用这些方法中的任何一个,则内部播放器引擎将不会调用用户提供的回调方法OnErrorListener.onError(),并且对象状态保持不变; 但是如果在reset()之后立即调用这些方法,则内部播放器引擎将调用用户提供的回调方法OnErrorListener.onError(),该对象将被转换为Error状态。
您无法立即启动()或在重置()后准备。根据重置文档:
将MediaPlayer重置为未初始化状态。 调用此方法后,您必须通过设置数据源并调用prepare()再次初始化它。
解决方案是
再次初始化MediaPlayer - >设置数据源 - >打电话准备。
或者,您可以避免执行重置onCompletion
。相反,请释放MediaPlayer onStop()
您可以按如下方式更新:
MediaPlayer soundOne = null;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
....
play_SoundOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
soundOne.start();
}
});
}
@Override
protected void onStart() {
super.onStart();
if(soundOne == null){
soundOne = MediaPlayer.create(this, R.raw.somesound);
soundOne.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//Don't reset
}
});
}
}
@Override
protected void onStop() {
super.onStop();
soundOne.release();
soundOne = null;
}