package com.google.mcommerce.sample.android.chapter10.mediarecorder; import java.io.File; import java.io.IOException; import android.app.Activity; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.media.CamcorderProfile; import android.media.MediaRecorder; import android.media.MediaRecorder.OnErrorListener; import android.media.MediaRecorder.OnInfoListener; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.SurfaceHolder; import android.view.View; import android.widget.Button; import android.widget.MediaController; import android.widget.Toast; import android.widget.VideoView; import com.google.mcommerce.sample.android.R; public class RecordVideo22Activity extends Activity implements SurfaceHolder.Callback, OnInfoListener, OnErrorListener { private static final String TAG = "RecordVideo"; private MediaRecorder mRecorder = null; private Camera mCamera = null; private String OUTPUT_FILE; private VideoView mVideoView = null; private Button mStartBtn = null; private SurfaceHolder mHolder; private boolean isRecording = false; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.c11_media_record_vedio_layout); mStartBtn = (Button) findViewById(R.id.beginBtn); mVideoView = (VideoView) this.findViewById(R.id.videoView); mHolder = mVideoView.getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void doClick(View view) { switch (view.getId()) { case R.id.beginBtn: beginRecording(); break; case R.id.stopBtn: stopRecording(); break; case R.id.playRecordingBtn: playRecording(); break; case R.id.stopPlayingRecordingBtn: stopPlayingRecording(); break; } } // Once we have a surface, we can start the previewing // Once we're previewing with Camera, we can setup the // MediaRecorder @Override public void surfaceCreated(SurfaceHolder holder) { Log.v(TAG, "surface created"); mStartBtn.setEnabled(true); try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); prepareForRecording(holder); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.v(TAG, "Surface changed: width x Height = " + width + "x" + height); } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.v(TAG, "surface destroyed"); } private void beginRecording() { mRecorder.setOnInfoListener(this); mRecorder.setOnErrorListener(this); mRecorder.start(); isRecording = true; } private void stopRecording() { Log.v(TAG, "stop recording"); if (mRecorder != null) { mRecorder.setOnInfoListener(null); mRecorder.setOnErrorListener(null); mRecorder.stop(); mRecorder.release(); mRecorder = null; } mCamera.release(); mCamera = null; isRecording = false; } private void playRecording() { MediaController mc = new MediaController(this); mVideoView.setMediaController(mc); mVideoView.setVideoPath(OUTPUT_FILE); mVideoView.start(); } private void stopPlayingRecording() { mVideoView.stopPlayback(); } @Override protected void onResume() { Log.v(TAG, "resuming"); mCamera = Camera.open(); Parameters camParams = mCamera.getParameters(); // camera.setDisplayOrientation(90); // We could set other parameters in camParams then: // camera.setParameters(camParams); super.onResume(); } @Override protected void onPause() { Log.v(TAG, "pausing"); if (mRecorder != null) { mRecorder.release(); mRecorder = null; } if (mCamera != null) { try { mCamera.reconnect(); // this also does a lock() mCamera.release(); mCamera = null; } catch (IOException e) { e.printStackTrace(); } } super.onPause(); } @Override protected void onDestroy() { Log.v(TAG, "destroying"); super.onDestroy(); } private void prepareForRecording(SurfaceHolder holder) { if (mRecorder != null) { mRecorder.reset(); } try { mCamera.unlock(); mRecorder = new MediaRecorder(); mRecorder.setCamera(mCamera); // Must be done while MediaRecorder is // idle mCamera.lock(); mRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); CamcorderProfile camProf = CamcorderProfile .get(CamcorderProfile.QUALITY_LOW); // mRecorder.setProfile(camProf); String fileExtension = ".mp4"; // if(camProf.fileFormat == MediaRecorder.OutputFormat.THREE_GPP) fileExtension = ".3gp"; OUTPUT_FILE = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) + "/videooutput" + fileExtension; File outFile = new File(OUTPUT_FILE); if (outFile.exists()) { outFile.delete(); } mRecorder.setOutputFile(OUTPUT_FILE); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); Log.i(TAG, "video output format is " + MediaRecorder.OutputFormat.THREE_GPP); mRecorder.setVideoFrameRate(camProf.videoFrameRate); Log.i(TAG, "Video Frame Rate: " + camProf.videoFrameRate); mRecorder.setVideoSize(camProf.videoFrameWidth, camProf.videoFrameHeight); Log.i(TAG, "Video size: " + camProf.videoFrameWidth + "x" + camProf.videoFrameHeight); mRecorder.setVideoEncoder(camProf.videoCodec); Log.i(TAG, "Video Encoder: " + camProf.videoCodec); mRecorder.setAudioEncoder(camProf.audioCodec); Log.i(TAG, "Audio Encoder: " + camProf.audioCodec); mRecorder.setPreviewDisplay(holder.getSurface()); mRecorder.setMaxDuration(30000); // limit to 30 seconds // Must implement onInfoListener mRecorder.prepare(); } catch (Exception e) { Log.e(TAG, e.toString()); e.printStackTrace(); } } @Override public void onInfo(MediaRecorder mediaRecorder, int what, int extra) { if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) { Log.i(TAG, "got a recording event"); mCamera.stopPreview(); Toast.makeText(this, "Recording limit has been reached. Stopping the recording", Toast.LENGTH_SHORT); isRecording = false; } } @Override public void onError(MediaRecorder mr, int what, int extra) { Log.e(TAG, "got a recording error"); mCamera.stopPreview(); Toast.makeText(this, "Recording error has occurred. Stopping the recording", Toast.LENGTH_SHORT); isRecording = false; } }