Android 在旋转器中重叠两个声音

Android 在旋转器中重叠两个声音,android,Android,我遇到以下问题: 我有一个旋转器,里面有不同的歌曲。在微调器中,用户可以预览选定的声音。我已经开发了那个部分。但我的问题是:当我从列表中选择一首歌曲时,它将播放。然后,当我们从列表中选择另一首歌曲时,Mediaplayer不会停止播放前一首歌曲。但我需要的是在用户选择另一首歌曲时停止上一首歌曲 这是我的密码 //set onClickListner to the onItem SelectedListner spinner.setOnItemSelectedListener(new Ad

我遇到以下问题:

我有一个旋转器,里面有不同的歌曲。在微调器中,用户可以预览选定的声音。我已经开发了那个部分。但我的问题是:当我从列表中选择一首歌曲时,它将播放。然后,当我们从列表中选择另一首歌曲时,Mediaplayer不会停止播放前一首歌曲。但我需要的是在用户选择另一首歌曲时停止上一首歌曲

这是我的密码

//set onClickListner to the onItem SelectedListner
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            choose_ringtone = (int) id;
           // Toast.makeText(setAlarm.this,"The selected choice is "+ id,Toast.LENGTH_SHORT).show();
            String ringtSound = String.valueOf(parent.getItemAtPosition(position));
            //set ringtone options
            switch (ringtSound) {
                case "alarm Sound 1":
                    mp = MediaPlayer.create(setAlarm.this, R.raw.wake_up);
                    break;
                case "alarm Sound 2":
                    mp = MediaPlayer.create(setAlarm.this, R.raw.alarm);
                    break;
                case "alarm Sound 3":
                    mp = MediaPlayer.create(setAlarm.this, R.raw.wake_up_tone);
                    break;
                case "alarm Sound 4":
                    mp = MediaPlayer.create(setAlarm.this, R.raw.sweet_alarm);
                    break;
                case "alarm Sound 5":
                    mp = MediaPlayer.create(setAlarm.this, R.raw.morning_alarm);
                    break;
                default:
                    break;

            }
            if(mp!=null) {
                mp.start();

            }
//将onClickListner设置为onItem SelectedListner
spinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
选择铃声=(int)id;
//Toast.makeText(setAlarm.this,“所选选项为”+id,Toast.LENGTH_SHORT).show();
String ringtSound=String.valueOf(parent.getItemAtPosition(position));
//设置铃声选项
开关(铃声){
“报警声1”案例:
mp=MediaPlayer.create(setAlarm.this,R.raw.wake_);
打破
“报警声2”案例:
mp=MediaPlayer.create(setAlarm.this,R.raw.alarm);
打破
“警报声3”案例:
mp=MediaPlayer.create(setAlarm.this,R.raw.wake\u-up\u-tone);
打破
“警报声4”案例:
mp=MediaPlayer.create(setAlarm.this,R.raw.sweet\u alarm);
打破
“警报声5”案例:
mp=MediaPlayer.create(setAlarm.this,R.raw.morning\u alarm);
打破
违约:
打破
}
如果(mp!=null){
mp.start();
}

开关
语句之前,您可以执行以下操作

if (mp != null && mp.isPlaying()) {
    mp.stop();
}
我不确定代码的其余部分是什么样子的,但请确保它也遵循以下提示,特别是:

还建议在不再使用MediaPlayer对象后,调用
release()
立即释放,以便与MediaPlayer对象关联的内部播放器引擎使用的资源可以立即释放。资源可能包括单例资源,如硬件加速组件和调用
释放()失败
可能会导致MediaPlayer对象的后续实例退回到软件实现或完全失败。一旦MediaPlayer对象处于结束状态,就无法再使用,也无法将其恢复到任何其他状态


switch
语句之前,您可以执行以下操作

if (mp != null && mp.isPlaying()) {
    mp.stop();
}
我不确定代码的其余部分是什么样子的,但请确保它也遵循以下提示,特别是:

还建议在不再使用MediaPlayer对象后,调用
release()
立即释放,以便与MediaPlayer对象关联的内部播放器引擎使用的资源可以立即释放。资源可能包括单例资源,如硬件加速组件和调用
释放()失败
可能会导致MediaPlayer对象的后续实例退回到软件实现或完全失败。一旦MediaPlayer对象处于结束状态,就无法再使用,也无法将其恢复到任何其他状态


在调用下面的函数之前,请尝试此操作

switch (ringtSound) {
                case "alarm Sound 1":
                      stopPlaying() 
                    mp = MediaPlayer.create(setAlarm.this, R.raw.wake_up);
                    mp.start();
                    break;   
            }
调用函数以停止声音

  private void stopPlaying() {
                if (mp != null) {
                    mp.stop();
                    mp.release();
                    mp = null;
               }
              }

在调用下面的函数之前,请尝试此操作

switch (ringtSound) {
                case "alarm Sound 1":
                      stopPlaying() 
                    mp = MediaPlayer.create(setAlarm.this, R.raw.wake_up);
                    mp.start();
                    break;   
            }
调用函数以停止声音

  private void stopPlaying() {
                if (mp != null) {
                    mp.stop();
                    mp.release();
                    mp = null;
               }
              }

尝试
mp.stop();
在开始任何声音之前…

尝试
mp.stop();
在开始任何声音之前…

谢谢。它的工作。我也使用isplay()检查mediaplayer是否正在运行。但我在交换机机箱后使用了它。我认为是这样的机箱。再次感谢您的建议。很高兴听到!这是表达感谢的好方法。谢谢。它的工作。我还使用iPlay()检查mediaplayer是否正在运行。但我在开关盒后使用了它。我认为是这样。再次感谢您的建议。很高兴听到!这是表达感谢的好方法。