如何在活动暂停前将媒体恢复到同一位置

时间:2014-11-13 07:00:03

标签: android

package com.ingenvis.omkareshwar;

公共类MantraActivity扩展ActionBarActivity实现OnPreparedListener,MediaController.MediaPlayerControl,View.OnClickListener {     android.support.v7.app.ActionBar actionBar;     ScrollView sv;     private static final String TAG =“AudioPlayer”;     私人MediaPlayer mediaPlayer;     private MediaController mediaController;     private String audioFile;     private Handler handler = new Handler();     int length,length1;

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

    Log.d("Reached here ", "Reached here");

//  Button playButton = (Button)findViewById(R.id.button2);
    TextView headingMantra2 = (TextView)findViewById(R.id.textHeading);
    TextView mantra2 = (TextView)findViewById(R.id.text_Mantra);
    TextView meaningTitleMantra2 = (TextView)findViewById(R.id.text_mean);
    TextView meaningMantra2 = (TextView)findViewById(R.id.textMeaning);

    sv = (ScrollView)findViewById(R.id.scrollView1);
    sv.scrollTo(0, 0);

    actionBar = getSupportActionBar();
    actionBar.setTitle("मंत्र ");
    actionBar.setIcon(R.drawable.om);
    actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#707069")));

    mediaPlayer = MediaPlayer.create(this, R.raw.record20140514130231);
    mediaPlayer.setOnPreparedListener(this);
    mediaController = new MediaController(this);

// mediaController.show();

    headingMantra2.setOnClickListener(this);
    mantra2.setOnClickListener(this);
    actionBar.setDisplayHomeAsUpEnabled(true);
    meaningTitleMantra2.setOnClickListener(this);
    meaningMantra2.setOnClickListener(this);


    actionBar.setHomeButtonEnabled(true);

}

 @Override
    public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()) {
            case android.R.id.home: {
                 Intent intent = new Intent(this, MainActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                    startActivityIfNeeded(intent, 0);
                    return true;
            }
            default:
                return super.onOptionsItemSelected(item);
        }
    }


 @Override
  public void onPause(){
     super.onPause();
     pause();
 }

 @Override
 public void onResume(){
     super.onResume();
     resume();
 }

@Override
public boolean onTouchEvent(MotionEvent event){
    mediaController.show();
    return false;
}

@Override
public void onClick(View v) {
    if(mediaPlayer.isPlaying())
       mediaController.show();

}


@Override
protected void onStop(){
    super.onStop();
    mediaController.hide();
    mediaPlayer.stop();
    mediaPlayer.release();
//  mediaPlayer = null;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.mantra, menu);
    return true;
}

@Override
public void onPrepared(MediaPlayer mp) {
    mediaController.setMediaPlayer(this);
    mediaController.setAnchorView(findViewById(R.id.button2));
}

@Override
public void start() {
    mediaPlayer.start();
}

public void play(View v){
    start();
}



@Override
public void pause() {
    mediaPlayer.pause();
    SharedPreferences prefs = this.getSharedPreferences("<com.ingenvis.omkareshwar>", Context.MODE_PRIVATE);
    Editor editor = prefs.edit();
    mediaPlayer.pause();
    length = mediaPlayer.getCurrentPosition();
    length1 = mediaPlayer.getDuration();

    editor.putInt("length", length); //assuming length is an integer
    editor.putInt("length1", length);
    editor.commit();
}

public void resume(){
     SharedPreferences prefs = this.getSharedPreferences("<com.ingenvis.omkareshwar>", Context.MODE_PRIVATE);
        int length = prefs.getInt("length", 0); //0 is the default value

//      mediaPlayer.start();
        mediaPlayer.seekTo(length);
}
@Override
public int getDuration() {
    return mediaPlayer.getDuration();
}


@Override
public int getCurrentPosition() {
    return mediaPlayer.getCurrentPosition();
}

@Override
public void seekTo(int pos) {
    mediaPlayer.seekTo(pos);

}

@Override
public boolean isPlaying() {
    return mediaPlayer.isPlaying();

}

@Override
public int getBufferPercentage() {

    return 0;
}

@Override
public boolean canPause() {
    return true;
}

@Override
public boolean  canSeekBackward() {
    return true;
}

@Override
public boolean canSeekForward() {
    return true;
}

@Override
public int getAudioSessionId() {
    return 0;
}



public void onBackPressed(){
//  mediaPlayer.stop();
    finish();
}

}

2 个答案:

答案 0 :(得分:1)

您可以使用SharedPreferences存储和检索length的值。

这是您修改后的onPause()

@Override
public void pause() {
    SharedPreferences prefs = this.getSharedPreferences("<com.your.app>", Context.MODE_PRIVATE);
    Editor editor = prefs.edit();
    mediaPlayer.pause();
    length = mediaPlayer.getCurrentPosition();
    length1 = mediaPlayer.getDuration();

    editor.putInt("length", length); //assuming length is an integer
    editor.putInt("length1", length);
    editor.commit();
}

您可以在onResume()这样的

中阅读它
public void resume(){
    SharedPreferences prefs = this.getSharedPreferences("<com.your.app>", Context.MODE_PRIVATE);
    int length = prefs.getInt("length", 0); //0 is the default value

    mediaPlayer.start();
    mediaPlayer.seekTo(length);
}

答案 1 :(得分:0)

在onPause()中,保存播放器的当前位置,例如在共享偏好中。在onResume()中,检索该值,然后使用MediaPlayer.seekTo()进行定位。

This developer.android.com link可能会为您提供更多见解。

@Override
protected void onPause() {

Log.d(App.TAG, "onPause called");

if(mMediaPlayer==null){
    Log.d(App.TAG, "Returning from onPause because the mediaplayer is null");
    super.onPause();
    return;
}

// the OS is pausing us, see onResume() for resume logic
settings = getSharedPreferences(Dawdle.TAG, MODE_PRIVATE);
SharedPreferences.Editor ed = settings.edit();
mMediaPlayer.pause();
ed.putInt("LAST_POSITION", mMediaPlayer.getCurrentPosition());  // remember where we are
ed.putBoolean("PAUSED", true); 
ed.commit();
Log.d(App.TAG, "LAST_POSITION saved:" + mMediaPlayer.getCurrentPosition());

super.onPause();
releaseMediaPlayer();

}

@Override
public void onResume() {
  Log.d(App.TAG, "onResume called");

try {

    if (mMediaPlayer==null){
        setupMediaPlayer();
    }

    // if we were paused (set in this.onPause) then resume from the last position
    settings = getSharedPreferences(Dawdle.TAG, MODE_PRIVATE);
    if (settings.getBoolean("PAUSED", false)) {
        // resume from the last position
        startPosition= settings.getInt("LAST_POSITION", 0);
        Log.d(App.TAG,"Seek to last position:" + startPosition);
    }

    mMediaPlayer.setDataSource(path);
    mMediaPlayer.setDisplay(holder);

    // this is key, the call will return immediately and notify this when the player is prepared through a callback to onPrepared
    // so we do not block on the UI thread - do not call any media playback methods before the onPrepared callback
    mMediaPlayer.prepareAsync();  

} catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IllegalStateException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

}

private void startVideoPlayback() {
   Log.v(App.TAG, "startVideoPlayback at position:" + startPosition);
   mMediaPlayer.seekTo(startPosition);
   mMediaPlayer.start();
}