Reputation: 3
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
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
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