在android中使用搜索栏和音乐

时间:2014-07-13 16:51:31

标签: android android-mediaplayer android-seekbar

我实际上正在创建一个带有按钮,搜索栏和图像的应用程序。该按钮用于播放/暂停音乐。在添加搜索栏之前,音乐播放顺畅。但是,在为搜索栏编写代码以使音乐位置进展之后,音乐似乎有些不稳定。 此外,我想重置搜索栏的位置以启动,并在音乐播放完毕后将按钮上的文本更改为“播放”。 任何人都可以告诉我为什么在实施搜索栏之后音乐会起伏不定? 另外,建议我在音乐播放结束后如何处理。 我使用的编码如下:

public class MainActivity extends ActionBarActivity {

private MediaPlayer song;
private SeekBar seekbar;

private final Handler handler = new Handler();

private final Runnable updatePositionRunnable = new Runnable() {
        public void run() {
                updatePosition();
        }
};

//private boolean isPlaying = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();
    }

    seekbar = (SeekBar)findViewById(R.id.musicSeekBar);
    song = MediaPlayer.create( MainActivity.this, R.raw.xyz);   
    seekbar.setMax(song.getDuration());

    final Button playButton = (Button)findViewById(R.id.playButton);


    playButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {


            if(song.isPlaying()){
                playButton.setText("Play");
                song.pause();
                //isPlaying = false;
                handler.removeCallbacks(updatePositionRunnable);
            }
            else{
                playButton.setText("Pause");
                song.start();
                //isPlaying = true;
                updatePosition();
            }
        }
    });

    song.setOnCompletionListener(new OnCompletionListener() {

        @Override
        public void onCompletion(MediaPlayer mp) {
            playButton.setText("Play");
            //seekbar.setProgress(0);
            //mp.stop();
        }
    });

    seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {


        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {


        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            song.seekTo(progress);
        }
    });
private void updatePosition(){
    handler.removeCallbacks(updatePositionRunnable);

    seekbar.setProgress(song.getCurrentPosition());

    handler.postDelayed(updatePositionRunnable, 2000);
}


@Override
public void onBackPressed() {

    super.onBackPressed();
    song.stop();
    song.release();
}

2 个答案:

答案 0 :(得分:0)

当您每隔2秒从updatePosition方法更新搜索栏的进度时,将调用侦听器中的onProgressChanged方法,这将设置播放的位置并导致轻微的昙花一现。您可能希望仅在用户与SeekBar交互时才调用onProgressChanged,但不幸的是情况并非如此。

我不知道有一个干净的解决方案。您可以做的是在调用seekbar.setProgress之前立即在代码中设置一个布尔标志,指示下一个onProgressChanged回调不是由用户引起的,因此您可以忽略它。您应该使用AtomicBoolean来实现此目的,因为事件可能来自不同的线程。

答案 1 :(得分:0)

这对我有用:

sBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

        boolean userTouch;
        @Override
        public void onStopTrackingTouch(SeekBar arg0) {
            userTouch = false;
        }
        @Override
        public void onStartTrackingTouch(SeekBar arg0) {
            userTouch = true;
        }
        @Override
        public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
            if(mPlayer.isPlaying() && arg2)
                mPlayer.seekTo(arg1);
            }
    });