在我的Android音乐播放器上修复了搜索栏

时间:2015-08-30 12:46:25

标签: java android seekbar audio-player android-music-player

我在Android中创建了一个简单的音乐播放器,它有一个搜索栏,显示歌曲播放中的当前位置。前进,后退,播放和暂停功能正常工作。我想要做的是让搜索栏真正移动歌曲中的位置。 (目前搜索栏不会改变歌曲中的位置。继承我的代码

public class MusicPlayerA extends Activity {

private MediaPlayer mediaPlayer;
public TextView songName, duration;
private double timeElapsed = 0, finalTime = 0;
private int forwardTime = 2500, backwardTime = 2500;
private Handler durationHandler = new Handler();
private SeekBar seekbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //set the layout of the Activity
    setContentView(R.layout.musicplayerview);
    //initialize views
    initializeViews();
}

@Override
protected void onPause() {
    super.onPause();
    if (mediaPlayer != null) {
        mediaPlayer.pause();
        if (isFinishing()) {
            mediaPlayer.stop();
            mediaPlayer.release();
        }
    }
}

public void initializeViews(){
    songName = (TextView) findViewById(R.id.songName);
    mediaPlayer = MediaPlayer.create(this, R.raw.druidsad);
    finalTime = mediaPlayer.getDuration();
    duration = (TextView) findViewById(R.id.songDuration);
    seekbar = (SeekBar) findViewById(R.id.seekBar);
    songName.setText("Druids Ad");  
    seekbar.setMax((int) finalTime);
    seekbar.setClickable(true);
}

// play mp3 song
public void play(View view) {
    mediaPlayer.start();
    timeElapsed = mediaPlayer.getCurrentPosition();
    seekbar.setProgress((int) timeElapsed);
    durationHandler.postDelayed(updateSeekBarTime, 100);
}

//handler to change seekBarTime
private Runnable updateSeekBarTime = new Runnable() {
    public void run() {
        //get current position
        timeElapsed = mediaPlayer.getCurrentPosition();
        //set seekbar progress
        seekbar.setProgress((int) timeElapsed);
        //set time remaining
        double timeRemaining = finalTime - timeElapsed;
        duration.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) timeRemaining), TimeUnit.MILLISECONDS.toSeconds((long) timeRemaining) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) timeRemaining))));

        //repeat yourself that again in 100 miliseconds
        durationHandler.postDelayed(this, 100);
    }
};

// pause mp3 song
public void pause(View view) {
    mediaPlayer.pause();
}

// go forward at forwardTime seconds
public void forward(View view) {
    //check if we can go forward at forwardTime seconds before song endes
    if ((timeElapsed + forwardTime) <= finalTime) {
        timeElapsed = timeElapsed + forwardTime;

        //seek to the exact second of the track
        mediaPlayer.seekTo((int) timeElapsed);
    }
}

// go backwards at backwardTime seconds
public void rewind(View view) {
    //check if we can go back at backwardTime seconds after song starts
    if ((timeElapsed - backwardTime) > 0) {
        timeElapsed = timeElapsed - backwardTime;

        //seek to the exact second of the track
        mediaPlayer.seekTo((int) timeElapsed);
    }
}

 // handler for back button used on music player screen
 public void BackButton2 (View view) {

    MediaPlayer mMediaPlayer = MediaPlayer.create(this, R.raw.soundbackbutton) ;
    mMediaPlayer.start();

    Vibrator vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    vib.vibrate(200);

    Intent mus = new Intent (this, Music.class);
    startActivity(mus);
 }

// handler for home button used on all screens
public void BackButton (View view) {

    MediaPlayer mMediaPlayer = MediaPlayer.create(this, R.raw.soundbackbutton) ;
    mMediaPlayer.start();

    Vibrator vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    vib.vibrate(200);

    Intent mn = new Intent (this, Music.class);
    startActivity(mn);
 }

}

3 个答案:

答案 0 :(得分:3)

很容易。请按照下列步骤操作: -

  1. 添加搜索栏更改侦听器。

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {         
        int seeked_progess;
    
        @Override
        public void onProgressChanged(final SeekBar seekBar, int progress, boolean fromUser) {
    
            seeked_progess = progress;
            seeked_progess = seeked_progess * 1000;
    
            if (fromUser) {                 
            }
        }
    
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
    
        }
    
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
    
        }
    });
    
  2. 现在在if(fromUser)中,你需要添加实现。

      if (fromUser) {
    
                Runnable mRunnable = new Runnable() {
    
                    @Override
                    public void run() {
                        int min, sec;
    
                        if (mediaPlayer != null /*Checking if the
                           music player is null or not otherwise it
                           may throw an exception*/) {
                            int mCurrentPosition = seekBar.getProgress();
    
                            min = mCurrentPosition / 60;
                            sec = mCurrentPosition % 60;
    
                            Log.e("Music Player Activity", "Minutes : "+min +" Seconds : " + sec);
    
                            /*currentime_mm.setText("" + min);
                            currentime_ss.setText("" + sec);*/
                        }
                        mHandler.postDelayed(this, 1000);
                    }
                };
                mRunnable.run();}
    
  3. 最后在onStopTrackingTouch()

    中添加此内容
    @Override
     public void onStopTrackingTouch(SeekBar seekBar) {
         mediaPlayer.seekTo(seeked_progess);
        }
    });
    
  4. 注意: -

    全局变量中的mHandler。  初始化如下。

    Handler mHandler = new Handler();
    

    其次currentime_mmcurrentime_ss是显示搜索栏当前搜索时间的文本视图。

    最重要的是, 别忘了在歌曲开始时添加这些

    seekBar.setProgress(0);// To set initial progress, i.e zero in starting of the song
    seekBar.setMax(mediaDuration);// To set the max progress, i.e duration of the song
    

答案 1 :(得分:0)

将此代码放入onCreate()方法

     seekbar.setMax(mediaPlayer.getDuration());
     seekbar.setProgress(mediaPlayer.getCurrentPosition());
    new Timer().scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run()
        {
             seekbar.setProgress(mediaPlayer.getCurrentPosition());
        }
    },0,1000);
     seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b)
        {
            mediaPlayer.seekTo(i);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

答案 2 :(得分:0)

Punam所做的很好,但是在您的“ onProgressChanged”函数中添加了一个条件,如下所示:

@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b)
{
    if(b)
        mediaPlayer.seekTo(i);
}