123troy
123troy

Reputation: 3

Resuming video after back button was pressed

I am writing an app for movies on my son's tablet and periodically he hits the back or home button. Being 2 yrs old he gets frustrated because he lost the video he was watching. I am able to save the state when he hits the home button so when he goes back into the app the movie resumes. Unfortunately, no matter how I try to set the back button, it always starts at the beginning again.

I have tried the onBackPressed and KeyDown Methods, but they done seem to work. Am I missing something?

I appreciate any help and I apologize if this is a duplicate and I not finding it.

package com.example.toddlerplayer;


import java.io.File;
import java.util.ArrayList;


import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
import android.widget.VideoView;
import com.example.scoobyplayer.R;

public class MainActivity extends Activity implements OnGestureListener {

    private VideoView videoview;
    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;
    private GestureDetector gDetector;
    int i = 0;
    int stopPosition = -1;
    String startFile = "startFile";
    String startState = "startState";
    String startArray;
    ArrayList <String> videoPaths = new ArrayList<String>();


@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    File dir = new File("/mnt/sdcard2/Movies/scooby/");

    videoview = (VideoView)findViewById(R.id.myvideoview);
    videoview.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);

    if (savedInstanceState != null) {
        videoPaths = savedInstanceState.getStringArrayList("movieList");
        i = savedInstanceState.getInt(startFile);
        stopPosition = savedInstanceState.getInt(startState);
    } else {
        String [] chld = dir.list();
        for (int x =0; x <chld.length; x++) {
                String fname = chld[x];
                videoPaths.add(dir+"/"+fname);      
        }
    }

    videoview.setVideoPath(videoPaths.get(i));
    //videoview.setOnCompletionListener(this);
    //videoview.setOnPreparedListener(this);
    //videoview.setOnTouchListener(this);
    // Gesture detection
    gDetector = new GestureDetector(this);

    videoview.start();

    videoview.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(final MediaPlayer mp) {
            i = (i + 1);
            if (i >= videoPaths.size())
            {
                finish();
            } else {
                videoview.setVideoPath(videoPaths.get(i));
                videoview.start();
            }

        }

    }); 



}
@Override
public boolean onTouchEvent(MotionEvent me) {
    boolean result = gDetector.onTouchEvent(me);
    if(!result){
        if(me.getAction() == MotionEvent.ACTION_DOWN){
            if(videoview.isPlaying()){
                 videoview.pause();
                 result = true;
            } else {
                 videoview.start();
                 result = false;
            }
            //result = true;    
        } else {
            result = false;
        }
    }
    return result;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    try {
        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
            return false;
        // right to left swipe
        if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            //Toast.makeText(MainActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
            i = (i + 1);
            if (i >= videoPaths.size())
            {
                i = 0;
            }
            videoview.stopPlayback();
            videoview.setVideoPath(videoPaths.get(i));
            videoview.start();
            Toast.makeText(MainActivity.this,videoPaths.get(i), Toast.LENGTH_SHORT).show();
        //left to right swipe    
        }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            //Toast.makeText(MainActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show();
            i = (i - 1);
            if (i < 0)
            {
                i = videoPaths.size() - 1;
            }
            videoview.stopPlayback();
            videoview.setVideoPath(videoPaths.get(i));
            videoview.start();
            Toast.makeText(MainActivity.this,videoPaths.get(i), Toast.LENGTH_SHORT).show();
        }
    } catch (Exception e) {
        // nothing
    }
    return false;
}



@Override
public boolean onDown(MotionEvent arg0) {
        // TODO Auto-generated method stub
        return false;
}

@Override
public void onLongPress(MotionEvent arg0) {
        // TODO Auto-generated method stub
}
@Override
public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {
          // TODO Auto-generated method stub
          return false;
}
@Override
public void onShowPress(MotionEvent arg0) {
        // TODO Auto-generated method stub
}
@Override
public boolean onSingleTapUp(MotionEvent arg0) {
        // TODO Auto-generated method stub
        return false;
}
@Override
public void onStop() {
    super.onStop();
    stopPosition = videoview.getCurrentPosition(); 
    videoview.stopPlayback();
    //Toast.makeText(MainActivity.this,stopPosition, Toast.LENGTH_SHORT).show();
}
@Override
public void onStart() {
    if (stopPosition != -1) {
        videoview.seekTo(stopPosition);
    }
    videoview.start();
    super.onStart();
}
public void onSaveInstanceState(Bundle outState) {
    outState.putInt(startState, stopPosition);
    outState.putInt(startFile, i);
    outState.putStringArrayList("movieList", videoPaths);
    super.onSaveInstanceState(outState);
}
@Override
protected void onResume() {
  if (videoview != null)
      videoview.seekTo(stopPosition);
    videoview.resume();  
    super.onResume();
}

@Override
protected void onPause() {
  if (videoview != null)
    stopPosition = videoview.getCurrentPosition(); 
    videoview.pause();
    super.onPause();
}
@Override
public void onBackPressed() {
    stopPosition = videoview.getCurrentPosition();
    videoview.pause();
    super.onBackPressed();
}
}

Upvotes: 0

Views: 1285

Answers (2)

kike0kike
kike0kike

Reputation: 115

Create your own MediaController

MyMediaController.java

public class MyMediaController extends MediaController {
public MyMediaController(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public MyMediaController(Context context, boolean useFastForward) {
    super(context, useFastForward);
}

public MyMediaController(Context context) {
    super(context);
}

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    int keyCode = event.getKeyCode();
    if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU) {
        ((Activity) getContext()).finish();
        return true;
    }

    return super.dispatchKeyEvent(event);
}}

And then in your activity in onCreate. VideoActivity.java

video=(VideoView)findViewById(R.id.vvVideo);
    MyMediaController mediaController = new MyMediaController(this);

    video.setMediaController(new MediaController(this){
        public boolean dispatchKeyEvent(KeyEvent event)
        {
            if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP)
                finish();

            return super.dispatchKeyEvent(event);
        }
    });
    video.setMediaController(mediaController);

Upvotes: 2

panini
panini

Reputation: 2026

I see that you're storing the stopPosition in onStop() and resuming if stopPosition != 0 -- however stopPosition isn't being persisted between launches. When a user presses the back button, by default your activity is finished, which means any fields state you have set won't be maintained when the app is next launched.

To fix this, you could use SharedPreferences to persist the stopPosition. for example:

private static final String KEY_POSITION = "KEY_POSITION";

@Override
public void onStop(){
    super.onStop();
    stopPosition = videoview.getCurrentPosition(); 
    videoview.stopPlayback();
    persistStopPosition(stopPosition);
}

private void persistStopPosition(int stopPosition){
    SharedPreferences.Editor preferences = getSharedPreferences("Preferences", Context.MODE_PRIVATE).edit();
    preferences.putInt(KEY_POSITION, stopPosition);
    preferences.commit(); // need this to ensure data is persisted.
}

and then in onStart():

@Override
public void onStart(){
    SharedPreferences preferences = getSharedPreferences("Preferences", Context.MODE_PRIVATE);
    stopPosition = preferences.getInt(KEY_POSITION, -1);
    if (stopPosition != -1) {
        videoview.seekTo(stopPosition);
    }
    videoview.start();
    super.onStart();
}

Upvotes: 3

Related Questions