01.10
I had to build a simple Android video player while reading “Hello, Android” Second Edition by Ed Burnette. I am about half way through this book, and it is excellent! The author gets right to the point and the lessons are completely hands on.
After completing the short video player tutorial, you notice how the video restarts after device configuration changes, such as a screen rotation. The book suggests using the ‘onRetainNonConfigurationInstance()’ and ‘getLastNonConfigurationInstance()’ methods to save data which would otherwise be lost during the ‘onCreate()’ and ‘onDestroy()’ methods. I decided to figure this out on my own and… it works
The code is basic and probably has some inefficient stuff, but I think it is a sufficient example of saving the video state. Keep in mind that the ‘getLastNonConfigurationInstance()’ method is great for any instance that needs to be able to transition smoothly during changes such as a screen rotation.
package org.example.video;
import android.app.Activity;
import android.os.Bundle;
import android.widget.VideoView;
import android.util.Log;
public class Video extends Activity {
public static final String TAG = "Video";
private VideoView videoObject;
private String videoLocation;
private int videoPosition;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// create view
setContentView(R.layout.main);
// initialize video object
videoObject = (VideoView) findViewById(R.id.video);
// attempt to get data from before device configuration change
Bundle returnData = (Bundle) getLastNonConfigurationInstance();
if (returnData == null) {
// first startup
Log.d(TAG, "Player started for 1st time");
// set video path
videoLocation = "/sdcard/DCIM/Camera/video-2010-01-10-15-21-17.3gp";
videoObject.setVideoPath(videoLocation);
// play video
videoObject.start();
} else {
// restart after device config change
Log.d(TAG, "Player re-started after device configuration change");
// fetch data from bundle
videoLocation = returnData.getString("LOCATION");
videoPosition = returnData.getInt("POSITION");
Log.d(TAG, "Video location: " + videoLocation);
Log.d(TAG, "Video position: " + videoPosition);
// apply properties to new object
videoObject.setVideoPath(videoLocation);
videoObject.seekTo(videoPosition);
// play video
videoObject.start();
}
}
@Override
public Object onRetainNonConfigurationInstance() {
// Device configuration changed
// Save current video playback state
Log.d(TAG, "Saving video playback state");
videoPosition = videoObject.getCurrentPosition();
Log.d(TAG, "Video location: " + videoLocation);
Log.d(TAG, "Video position: " + videoPosition);
// Build bundle to save data for return
Bundle data = new Bundle();
data.putString("LOCATION", videoLocation);
data.putInt("POSITION", videoPosition);
return data;
}
}

No Comment.
Add Your Comment