如何停止Mediaplayer

问题描述 投票:1回答:2

我有3音。我正在调用playmusic()函数在imageview切换上播放这些音调中的2个。当我第一次单击imageview时,tone1开始播放。当我在同一imageview上单击第二次时,tone2开始播放,但tone1没有停止。

我的requiremet是,当我单击imageview时-(第一次-音调1应该开始播放)。(第二次-音调1应该停止播放,音调2应该开始播放)(第三次-音调2应该停止播放,音调1应该重新开始播放)等等。...

 String file=null;
 int x=0;
    public void playMusic(int i) {
        x=i;
        if(i==1){
            file = R.raw.tone1;
        }else if(i==2){
            file = R.raw.tone2;
        }else{
            file = R.raw.tone3;
        }
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        AssetFileDescriptor assetFileDescriptor = 
        Main2Activity.this.getResources().openRawResourceFd(file);
        if(assetFileDescriptor == null) return;
        try {
            mediaPlayer.setDataSource(
                    assetFileDescriptor.getFileDescriptor(),
                    assetFileDescriptor.getStartOffset(),
                    assetFileDescriptor.getLength()
            );
            assetFileDescriptor.close();

            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    if(mediaPlayer != null){
                        mediaPlayer.release();
                        mediaPlayer = null;
                    }
                }
            });

            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(final MediaPlayer mediaPlayer) {
                    mediaPlayer.start();
                }
            });
            mediaPlayer.prepareAsync();

        } catch (IllegalArgumentException e) {
//                            HelpFunctions.showLog("ERROR = " + e);
        } catch (IllegalStateException e) {
//                            HelpFunctions.showLog("ERROR = " + e);
        } catch (IOException e) {
//                            HelpFunctions.showLog("ERROR = " + e);
        }
    }
android android-mediaplayer
2个回答
0
投票

当我第二次单击相同的图像视图时,tone2开始播放,但是tone1没有停止。

如果这是唯一的问题,请在致电mediaPlayer = new MediaPlayer();之前尝试放置以下行:

if (mediaPlayer != null && mediaPlayer.isPlaying()) mediaPlayer.stop();


0
投票

我对您的逻辑做了一些小的修改,并添加了mediaplayer.reset()。这是解决方案link

public class MainActivity extends AppCompatActivity {

   @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      final ImageView player = findViewById(R.id.play);
      player.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
             playMusic(1);
         }
       });

      mediaPlayer = new MediaPlayer();
  }

    int file = 0;
    MediaPlayer mediaPlayer;

    int x = 0;

    public void playMusic(int i) {
     x = x + i;
     if (x == 1) {
     file = R.raw.tone1;
   } 
    else if (x == 2) {
    file = R.raw.tone2;
   } else {
    x = 0;
    file = R.raw.tone3;
    }
mediaPlayer.reset();

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
AssetFileDescriptor assetFileDescriptor =
    MainActivity.this.getResources().openRawResourceFd(file);
if (assetFileDescriptor == null) return;
try {
  mediaPlayer.setDataSource(
      assetFileDescriptor.getFileDescriptor(),
      assetFileDescriptor.getStartOffset(),
      assetFileDescriptor.getLength()
  );
  assetFileDescriptor.close();

  mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
      if (mediaPlayer != null) {
        mediaPlayer.release();
      }
    }
  });

  mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(final MediaPlayer mediaPlayer) {
      mediaPlayer.start();
    }
  });
  mediaPlayer.prepareAsync();
} catch (IllegalArgumentException e) {
  //                            HelpFunctions.showLog("ERROR = " + e);
} catch (IllegalStateException e) {
  //                            HelpFunctions.showLog("ERROR = " + e);
} catch (IOException e) {
  //                            HelpFunctions.showLog("ERROR = " + e);
}
}
}
© www.soinside.com 2019 - 2024. All rights reserved.