带有搜索栏的Android Media Player始终更新和重置

时间:2014-09-16 01:15:09

标签: android media-player seekbar

大家。

首先,我是新手。我创建了一个活动,从原始文件夹播放特定的mp3。它工作正常,播放得很好。我实现了媒体播放器,您将在下面的代码中看到。但问题是当我改变我的智能手机的方向时,播放器继续播放声音,但是重新打开/更新相同元素的新活动,如果我点击播放按钮,则mp3开始播放,但旧的活动剧照在后面播放,播放mp3 ....所以,现在播放2首相同的歌曲...

我不想更新活动或打开新活动。在改变智能手机方向之前,我只想继续播放正在播放的歌曲。

这是我的代码:

MP3PlayerActivity.java(主要)

public class Mp3PlayerActivity extends Activity implements OnPreparedListener {
/** Called when the activity is first created. */
private Button btnPlay;
private Button btnPause;
private int current = 0;
private boolean   running = true;
private int duration = 0;
private MediaPlayer mPlayer;
private SeekBar mSeekBarPlayer;
private TextView mMediaTime;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);






    mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.goodthings);
    btnPlay = (Button) findViewById(R.id.button1);
    btnPause = (Button) findViewById(R.id.button2);
    mMediaTime = (TextView)findViewById(R.id.mediaTime);
    mSeekBarPlayer = (SeekBar)findViewById(R.id.progress_bar);
    mPlayer.setOnPreparedListener(this);

    mSeekBarPlayer.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) {
            if(fromUser){
                mPlayer.seekTo(progress);
                updateTime();
            }
        }
    });



    btnPlay.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            try {
                mPlayer.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            mPlayer.start();
            mSeekBarPlayer.postDelayed(onEverySecond, 1000);
        }

        public void onCompletion( MediaPlayer mPlayer)
        {
            mPlayer.release();

        }
    });


    btnPause.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mPlayer.pause();
        }
        public void onCompletion( MediaPlayer mPlayer)
        {
            mPlayer.release();

        }
    });
}

private Runnable onEverySecond = new Runnable() {
    @Override
    public void run(){
        if(true == running){
            if(mSeekBarPlayer != null) {
                mSeekBarPlayer.setProgress(mPlayer.getCurrentPosition());
            }

            if(mPlayer.isPlaying()) {
                mSeekBarPlayer.postDelayed(onEverySecond, 1000);
                updateTime();
            }
        }
    }
};

private void updateTime(){
    do {
        current = mPlayer.getCurrentPosition();
        System.out.println("duration - " + duration + " current- "
                + current);
        int dSeconds = (int) (duration / 1000) % 60 ;
        int dMinutes = (int) ((duration / (1000*60)) % 60);
        int dHours   = (int) ((duration / (1000*60*60)) % 24);

        int cSeconds = (int) (current / 1000) % 60 ;
        int cMinutes = (int) ((current / (1000*60)) % 60);
        int cHours   = (int) ((current / (1000*60*60)) % 24);

        if(dHours == 0){
            mMediaTime.setText(String.format("%02d:%02d / %02d:%02d", cMinutes, cSeconds, dMinutes, dSeconds));
        }else{
            mMediaTime.setText(String.format("%02d:%02d:%02d / %02d:%02d:%02d", cHours, cMinutes, cSeconds, dHours, dMinutes, dSeconds));
        }

        try{
            Log.d("Value: ", String.valueOf((int) (current * 100 / duration)));
            if(mSeekBarPlayer.getProgress() >= 100){
                break;
            }
        }catch (Exception e) {}
    }while (mSeekBarPlayer.getProgress() <= 100);
}

@Override
public void onPrepared(MediaPlayer arg0) {
    // TODO Auto-generated method stub
    duration = mPlayer.getDuration();
    mSeekBarPlayer.setMax(duration);
    mSeekBarPlayer.postDelayed(onEverySecond, 1000);
}
}

1 个答案:

答案 0 :(得分:0)

当您旋转设备时,会再次调用onCreate(),因此您在onCreate()中执行的所有操作都会重新执行 - 这意味着重新创建MediaPlayer并重新设置所有内容变量。

如果这是第一次调用onCreate(),你需要做的只是创建那些东西。

在这里查看更多信息: http://developer.android.com/guide/topics/resources/runtime-changes.html