如何让音乐停止?

发布时间:2021-03-08 15:52

所以我做了一个可以正常工作的媒体播放器,但我有一个大问题,按下播放后,如果我关闭活动或应用程序,音乐会继续播放,如果我再次点击,音乐会在另一个播放,我不知道如何解决它。我只想在关闭 Activity 或应用程序后音乐停止,没有任何问题。

完整代码如下:

public class m1 extends AppCompatActivity {

ImageView backm1, replay, forward, btPlay, btPause;
TextView playerPosition, playerDuration;
CircularSeekBar seekBar;

MediaPlayer mediaPlayer;
Handler handler = new Handler();
Runnable runnable;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_m1);

    backm1 = (ImageView) findViewById(R.id.backm1);

    backm1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            m1.super.onBackPressed();
        }
    });

    playerPosition = findViewById(R.id.playerPosition);
    playerDuration = findViewById(R.id.playerDuration);
    replay = findViewById(R.id.replay);
    forward = findViewById(R.id.forward);
    seekBar = findViewById(R.id.seekBar);
    btPause = findViewById(R.id.btPause);
    btPlay = findViewById(R.id.btPlay);

    mediaPlayer = MediaPlayer.create(this,R.raw.ding_dong);

    runnable = new Runnable() {
        @Override
        public void run() {
            seekBar.setProgress(mediaPlayer.getCurrentPosition());

            handler.postDelayed(this,500);
        }
    };

    int duration = mediaPlayer.getDuration();

  String sDuration = convertFormat(duration);

  playerDuration.setText(sDuration);

  btPlay.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          btPlay.setVisibility(View.GONE);

          btPause.setVisibility(View.VISIBLE);

          mediaPlayer.start();

          seekBar.setMax(mediaPlayer.getDuration());

          handler.postDelayed(runnable, 0);
      }
  });

  btPause.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          btPause.setVisibility(View.GONE);

          btPlay.setVisibility(View.VISIBLE);

          mediaPlayer.pause();

          handler.removeCallbacks(runnable);
      }
  });

  forward.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          int currentPosition = mediaPlayer.getCurrentPosition();

          int duration = mediaPlayer.getDuration();

          if(mediaPlayer.isPlaying() && duration != currentPosition){

              currentPosition = currentPosition + 10000;
               playerPosition.setText(convertFormat(currentPosition));

               mediaPlayer.seekTo(currentPosition);
          }
      }
  });

  replay.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          int currentPosition = mediaPlayer.getCurrentPosition();

          if (mediaPlayer.isPlaying() && currentPosition > 10000){
              currentPosition = currentPosition - 10000;

              playerPosition.setText(convertFormat(currentPosition));

              mediaPlayer.seekTo(currentPosition);
          }
      }
  });

  seekBar.setOnSeekBarChangeListener(new CircularSeekBar.OnCircularSeekBarChangeListener() {
      @Override
      public void onProgressChanged(CircularSeekBar circularSeekBar, float v, boolean b) {

          if (b) {

              mediaPlayer.seekTo((int) v);

          }
          playerPosition.setText(convertFormat(mediaPlayer.getCurrentPosition()));
      }

      @Override
      public void onStopTrackingTouch(CircularSeekBar circularSeekBar) {

      }

      @Override
      public void onStartTrackingTouch(CircularSeekBar circularSeekBar) {

      }
  });

  mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
      @Override
      public void onCompletion(MediaPlayer mp) {
          btPause.setVisibility((View.GONE));

          btPlay.setVisibility(View.VISIBLE);

          mediaPlayer.seekTo(0);
      }
  });

    }


    @SuppressLint("DefaultLocale")
    private String convertFormat(int duration) {
        return String.format("%02d:%02d"
                ,TimeUnit.MILLISECONDS.toMinutes(duration)
                ,TimeUnit.MILLISECONDS.toSeconds(duration) -
                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration)));
}
@Override
protected void onDestroy() {
    super.onDestroy();
    if(mediaPlayer !=null){
        mediaPlayer.stop();
        mediaPlayer.release();
    }
}
}

我添加了 onDestroy 但我认为以错误的方式出现了这个错误:

2021-03-08 10:13:40.843 419-4716/? E/AudioSystem: invalid attributes { Content type: AUDIO_CONTENT_TYPE_UNKNOWN Usage: AUDIO_USAGE_UNKNOWN Source: -1 Flags: 0x800 Tags:  } when converting to stream
2021-03-08 10:13:40.906 28868-28868/com.example.diligent E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.diligent, PID: 28868
java.lang.IllegalStateException
    at android.media.MediaPlayer.getCurrentPosition(Native Method)

我添加了这个:

 private void stopPlayer() {
    if (mediaPlayer != null) {
        mediaPlayer.release();
        mediaPlayer = null;
        Toast.makeText(this, "MediaPlayer released", Toast.LENGTH_SHORT).show();
    }
}

@Override
protected void onStop() {
    super.onStop();
    stopPlayer();
}

还有以下错误:

 java.lang.NullPointerException: Attempt to invoke virtual method 'int android.media.MediaPlayer.getCurrentPosition()' on a null object reference

欢迎提出任何其他建议。

提前致谢。

回答1

停止并释放 onDestroy 项活动的媒体资源。

@Override
    protected void onDestroy() {
        super.onDestroy();
        if(mediaPlayer !=null){
            mediaPlayer.stop();
            mediaPlayer.release();
        }
    }
回答2
MediaPlayer player; //MediaPlayer object 

*停止媒体播放器的功能*

private void stopPlayer() {
    if (player != null) {
        player.release();
        player = null;
        Toast.makeText(this, "MediaPlayer released", Toast.LENGTH_SHORT).show();
    }
}

在 onStop() 回调中调用函数

 @Override
protected void onStop() {
    super.onStop();
    stopPlayer();
}