2010
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