重置MediaPlayer后如何准备声音?

时间:2018-04-19 21:31:45

标签: java android

我正在尝试制作类似音板的应用。现在我在第一次播放后重置后播放相同声音时遇到小问题。

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()不起作用。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

基于documentation

  

调用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;
}