简体   繁体   中英

progress bar for music player doesnt work and crashes

this is my code, i am almost certain the problem is with the while loop.

       public void start(View view) {

        int currentPosition = 0;


        player = MediaPlayer.create(this, R.raw.sound);

        player.start();

        int total = player.getDuration();
        progressBar.setProgress(0);
        progressBar.setMax(player.getDuration());

        while (player != null && currentPosition < total) {
//            try {
//                Thread.sleep(500);

                currentPosition = player.getCurrentPosition();

//            } catch (InterruptedException e) {
//                return;
//            } catch (Exception e) {
//                return;
//            }

            progressBar.setProgress(currentPosition);
        }
    }


    public void stop(View view) {

        player.stop();

    }

whether or not i have the sleep intervals my result is the same; the sound starts playing but i cant stop it, and the progress bar doesn't move. i would appreciate some help

I used this code in my app for using seekBar with MediaPlayer. It implements Runnable to keep the seekBar updating as the music plays. Take a look at the code:

 public class MainActivity extends Activity implements Runnable,
  OnClickListener, OnSeekBarChangeListener {
 private SeekBar seekBar;
 private Button startMedia;
 private Button stopMedia;
 private MediaPlayer mp;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  seekBar = (SeekBar) findViewById(R.id.seekBar1);
  startMedia = (Button) findViewById(R.id.button1);
  stopMedia = (Button) findViewById(R.id.button2);
  startMedia.setOnClickListener(this);
  stopMedia.setOnClickListener(this);
  seekBar.setOnSeekBarChangeListener(this);
  seekBar.setEnabled(false);
 }

 public void run() {
  int currentPosition = mp.getCurrentPosition();
  int total = mp.getDuration();

  while (mp != null && currentPosition < total) {
   try {
    Thread.sleep(1000);
    currentPosition = mp.getCurrentPosition();
   } catch (InterruptedException e) {
    return;
   } catch (Exception e) {
    return;
   }
   seekBar.setProgress(currentPosition);
  }
 }

 public void onClick(View v) {
  if (v.equals(startMedia)) {
   if (mp == null) {
    mp = MediaPlayer.create(getApplicationContext(), R.raw.song2);
    seekBar.setEnabled(true);
   }
   if (mp.isPlaying()) {
    mp.pause();
    startMedia.setText("play");
   } else {
    mp.start();
    startMedia.setText("pause");
    seekBar.setMax(mp.getDuration());
    new Thread(this).start();
   }
  }

  if (v.equals(stopMedia) && mp != null) {
   if (mp.isPlaying() || mp.getDuration() > 0) {
    mp.stop();
    mp = null;
    startMedia.setText("play");
    seekBar.setProgress(0);
   }
  }

 }

 public void onProgressChanged(SeekBar seekBar, int progress,
   boolean fromUser) {
  try {
   if (mp.isPlaying() || mp != null) {
    if (fromUser)
     mp.seekTo(progress);
   } else if (mp == null) {
    Toast.makeText(getApplicationContext(), "Media is not running",
      Toast.LENGTH_SHORT).show();
    seekBar.setProgress(0);
   }
  } catch (Exception e) {
   Log.e("seek bar", "" + e);
   seekBar.setEnabled(false);

  }
 }

 @Override
 public void onStartTrackingTouch(SeekBar seekBar) {
  // TODO Auto-generated method stub

 }

 @Override
 public void onStopTrackingTouch(SeekBar seekBar) {
  // TODO Auto-generated method stub

 }
}

Thanks to: Sridhar Kulkarni

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM