package com.mobmonkey.mobmonkeyandroid;
import java.io.File;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import com.mobmonkey.mobmonkeyandroid.utils.MMCameraSurfaceView;
import com.mobmonkey.mobmonkeysdk.utils.MMSDKConstants;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class VideoRecorderActivity extends Activity {
private Camera camera;
private MMCameraSurfaceView cameraSurfaceView;
private MediaRecorder mediaRecorder;
private Button btnRecordStop;
private TextView tvElapsedTime;
private LinearLayout llVideoOkCancel;
private boolean isRecording;
private String videoPath;
private long startTime;
private Timer recordTimer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.video_recorder_screen);
isRecording = false;
File mmDir = new File(MMSDKConstants.MOBMONKEY_DIRECTORY);
if(!mmDir.exists()) {
mmDir.mkdir();
}
videoPath = MMSDKConstants.MOBMONKEY_RECORDED_VIDEO_FILEPATH;
camera = getCameraInstance();
if(camera == null) {
new AlertDialog.Builder(VideoRecorderActivity.this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle(R.string.ad_title_camera_error)
.setMessage(R.string.ad_message_camera_error)
.setNeutralButton(R.string.ad_btn_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
onBackPressed();
}
})
.show();
}
FrameLayout rlVideoPreview = (FrameLayout) findViewById(R.id.flvideopreview);
tvElapsedTime = (TextView) findViewById(R.id.tvelapsedtime);
btnRecordStop = (Button) findViewById(R.id.btnrecordstop);
llVideoOkCancel = (LinearLayout) findViewById(R.id.llvideookcancel);
cameraSurfaceView = new MMCameraSurfaceView(this, camera);
rlVideoPreview.addView(cameraSurfaceView);
}
/**
*
* @param view
*/
public void viewOnClick(View view) {
switch(view.getId()) {
case R.id.btnrecordstop:
recordStopOnClick();
break;
case R.id.btnok:
okOnClick();
break;
case R.id.btncancel:
cancelOnClick();
break;
}
}
/**
*
* @return
*/
private Camera getCameraInstance() {
Camera c = null;
try {
c = Camera.open();
c.setDisplayOrientation(90);
} catch(Exception ex) {
ex.printStackTrace();
}
return c;
}
/**
*
* @return
*/
private boolean prepareMediaRecorder() {
camera = getCameraInstance();
mediaRecorder = new MediaRecorder();
camera.unlock();
mediaRecorder.setCamera(camera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mediaRecorder.setVideoEncodingBitRate(3000000);
mediaRecorder.setVideoFrameRate(24);
mediaRecorder.setVideoSize(640, 480);
mediaRecorder.setOutputFile(videoPath);
mediaRecorder.setOrientationHint(90);
// maximun duration?
// mediaRecorder.setMaxDuration(60000);
// maximum file size?
// mediaRecorder.setMaxFileSize(5000000);
mediaRecorder.setPreviewDisplay(cameraSurfaceView.getHolder().getSurface());
try {
mediaRecorder.prepare();
} catch(IllegalStateException ex) {
ex.printStackTrace();
releaseMediaRecorder();
return false;
} catch(IOException ex) {
ex.printStackTrace();
releaseMediaRecorder();
return false;
}
return true;
}
/**
*
*/
public void recordStopOnClick() {
if(isRecording) {
mediaRecorder.stop();
releaseMediaRecorder();
llVideoOkCancel.setVisibility(View.VISIBLE);
btnRecordStop.setVisibility(View.INVISIBLE);
recordTimer.cancel();
} else {
releaseCamera();
if(!prepareMediaRecorder()) {
new AlertDialog.Builder(VideoRecorderActivity.this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle(R.string.ad_title_video_recording_error)
.setMessage(R.string.ad_message_video_recording_error)
.setNeutralButton(R.string.ad_btn_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
onBackPressed();
}
})
.show();
} else {
tvElapsedTime.setVisibility(View.VISIBLE);
mediaRecorder.start();
isRecording = true;
btnRecordStop.setText(R.string.btn_stop);
startTime = System.currentTimeMillis();
recordTimer = new Timer();
recordTimer.schedule(new TimerTask() {
@Override
public void run() {
recordedTime();
}
}, 0, 1000);
}
}
}
/**
*
*/
public void okOnClick() {
releaseCamera();
releaseMediaRecorder();
setResult(RESULT_OK);
recordTimer.cancel();
recordTimer = null;
finish();
}
/**
*
*/
public void cancelOnClick() {
isRecording = false;
llVideoOkCancel.setVisibility(View.INVISIBLE);
btnRecordStop.setText(R.string.btn_record);
btnRecordStop.setVisibility(View.VISIBLE);
tvElapsedTime.setText(MMSDKConstants.DEFAULT_STRING_EMPTY);
}
private void releaseMediaRecorder() {
if(mediaRecorder != null) {
mediaRecorder.reset();
mediaRecorder.release();
mediaRecorder = null;
camera.lock();
}
}
private void releaseCamera() {
if(camera != null) {
camera.release();
camera = null;
}
}
private void recordedTime() {
// long currentTime = System.currentTimeMillis(),
// elapsedTime = (currentTime - startTime)/1000;
// recordTime.setText(String.format("%ds", elapsedTime));
this.runOnUiThread(new Runnable() {
@Override
public void run() {
long currentTime = System.currentTimeMillis(),
elapsedTime = (currentTime - startTime)/1000;
tvElapsedTime.setText(String.format(" %ds ", elapsedTime));
}
});
}
@Override
public void onBackPressed() {
super.onBackPressed();
releaseMediaRecorder();
releaseCamera();
}
}