summaryrefslogtreecommitdiff
path: root/src/com
diff options
context:
space:
mode:
Diffstat (limited to 'src/com')
-rw-r--r--src/com/example/rotorm/CameraActivity.java380
-rw-r--r--src/com/example/rotorm/Preview.java181
2 files changed, 261 insertions, 300 deletions
diff --git a/src/com/example/rotorm/CameraActivity.java b/src/com/example/rotorm/CameraActivity.java
index 4018e47..7f30a21 100644
--- a/src/com/example/rotorm/CameraActivity.java
+++ b/src/com/example/rotorm/CameraActivity.java
@@ -1,188 +1,240 @@
package com.example.rotorm;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
+import java.io.File;
import java.io.IOException;
-
+import java.text.SimpleDateFormat;
+import java.util.Date;
import android.app.Activity;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.hardware.Camera;
-import android.hardware.Camera.AutoFocusCallback;
-import android.hardware.Camera.PictureCallback;
-import android.hardware.Camera.ShutterCallback;
+import android.hardware.Camera.CameraInfo;
+import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Bundle;
+import android.os.Environment;
import android.util.Log;
-import android.view.SurfaceView;
+import android.view.SurfaceHolder;
import android.view.View;
import android.view.View.OnClickListener;
-import android.view.View.OnLongClickListener;
import android.view.ViewGroup.LayoutParams;
-import android.view.Window;
-import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;
+public class CameraActivity extends Activity
+implements SurfaceHolder.Callback, OnClickListener {
+
+private static final String TAG = "CameraRecorderActivity";
+
+public static final int MEDIA_TYPE_IMAGE = 1;
+public static final int MEDIA_TYPE_VIDEO = 2;
+
+private Camera mCamera;
+private Preview mPreview;
+private MediaRecorder mMediaRecorder;
+private Button captureButton;
+private boolean isRecording = false;
+
+/** Called when the activity is first created. */
+@Override
+public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+ // Create an instance of Camera.
+ mCamera = getCameraInstance();
+ // Create preview view and set it as the content of our activity.
+ mPreview = new Preview(this, mCamera);
+ //int i = R.id.preview;
+ //Object o = this.findViewById(i);
+ //FrameLayout preview = (FrameLayout) o;
+ //preview.addView(mPreview);
+
+ mPreview.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
+ ((FrameLayout) findViewById(R.id.preview)).addView(mPreview);
+ mPreview.setKeepScreenOn(true);
+
+ // Add a listener to the Capture button
+ captureButton = (Button) findViewById(R.id.buttonClick);
+ captureButton.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (isRecording) {
+ // stop recording and release camera
+ mMediaRecorder.stop(); // stop the recording
+ releaseMediaRecorder(); // release the MediaRecorder object
+ mCamera.lock(); // take camera access back from MediaRecorder
+
+ // inform the user that recording has stopped
+ setCaptureButtonText("Capture");
+ isRecording = false;
+ } else {
+ // initialize video camera
+ if (prepareVideoRecorder()) {
+ // Camera is available and unlocked, MediaRecorder is prepared,
+ // now you can start recording
+ mMediaRecorder.start();
+
+ // inform the user that recording has started
+ setCaptureButtonText("Stop");
+ isRecording = true;
+ } else {
+ // prepare didn't work, release the camera
+ releaseMediaRecorder();
+ // inform user
+ }
+ }
+ }
+ }
+ );
+}
-//why is it so hard to put an eclipse project into git
-//http://developer.android.com/guide/topics/media/camera.html
-
-public class CameraActivity extends Activity {
- public static final String TAG = "rotorM";
- Preview preview;
- Button buttonClick;
- Camera camera;
- String fileName;
- Activity act;
- Context ctx;
- boolean isRecording;
- MediaRecorder mMediaRecorder;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ctx = this;
- act = this;
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
-
- setContentView(R.layout.main);
-
- preview = new Preview(this, (SurfaceView)findViewById(R.id.surfaceView));
- preview.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
- ((FrameLayout) findViewById(R.id.preview)).addView(preview);
- preview.setKeepScreenOn(true);
-
- buttonClick = (Button) findViewById(R.id.buttonClick);
-
- buttonClick.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- // preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback);
- //camera.takePicture(shutterCallback, rawCallback, jpegCallback);
- if (isRecording) {
- // stop recording and release camera
- mMediaRecorder.stop(); // stop the recording
- releaseMediaRecorder(); // release the MediaRecorder object
- camera.lock(); // take camera access back from MediaRecorder
-
- // inform the user that recording has stopped
- setCaptureButtonText("Capture");
- isRecording = false;
- } else {
- // initialize video camera
- if (prepareVideoRecorder()) {
- // Camera is available and unlocked, MediaRecorder is prepared,
- // now you can start recording
- mMediaRecorder.start();
-
- // inform the user that recording has started
- setCaptureButtonText("Stop");
- isRecording = true;
- } else {
- // prepare didn't work, release the camera
- releaseMediaRecorder();
- // inform user
- }
- }
- }
- });
-
- buttonClick.setOnLongClickListener(new OnLongClickListener(){
- @Override
- public boolean onLongClick(View arg0) {
- camera.autoFocus(new AutoFocusCallback(){
- @Override
- public void onAutoFocus(boolean arg0, Camera arg1) {
- //camera.takePicture(shutterCallback, rawCallback, jpegCallback);
- }
- });
- return true;
- }
- });
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- // preview.camera = Camera.open();
- camera = Camera.open();
- camera.startPreview();
- preview.setCamera(camera);
- }
-/*
- @Override
- protected void onPause() {
- if(camera != null) {
- camera.stopPreview();
- preview.setCamera(null);
- camera.release();
- camera = null;
- }
- super.onPause();
- }
- */
-
- @Override
- protected void onPause() {
- super.onPause();
- releaseMediaRecorder(); // if you are using MediaRecorder, release it first
- releaseCamera(); // release the camera immediately on pause event
+public void setCaptureButtonText(String s) {
+ captureButton.setText(s);
+}
+
+@Override
+public void surfaceCreated(SurfaceHolder holder) {
+ // The Surface has been created, now tell the camera where to draw the preview.
+ try {
+ mCamera.setPreviewDisplay(holder);
+ mCamera.startPreview();
+ } catch (IOException e) {
+ Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
+}
+
+@Override
+public void surfaceChanged(SurfaceHolder holder, int format, int width,
+ int height) {
+ // TODO Auto-generated method stub
+}
+
+@Override
+public void surfaceDestroyed(SurfaceHolder holder) {
+ // TODO Auto-generated method stub
+}
- private void releaseMediaRecorder(){
- if (mMediaRecorder != null) {
- mMediaRecorder.reset(); // clear recorder configuration
- mMediaRecorder.release(); // release the recorder object
- mMediaRecorder = null;
- camera.lock(); // lock camera for later use
+/** Create a File for saving an image or video */
+private static File getOutputMediaFile(int type){
+ // To be safe, you should check that the SDCard is mounted
+ // using Environment.getExternalStorageState() before doing this.
+ File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
+ Environment.DIRECTORY_PICTURES), "MyCameraApp");
+ // This location works best if you want the created images to be shared
+ // between applications and persist after your app has been uninstalled.
+ // Create the storage directory if it does not exist
+ if (! mediaStorageDir.exists()){
+ if (! mediaStorageDir.mkdirs()){
+ Log.d("MyCameraApp", "failed to create directory");
+ return null;
}
}
+ // Create a media file name
+ String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
+ File mediaFile;
+ if (type == MEDIA_TYPE_IMAGE){
+ mediaFile = new File(mediaStorageDir.getPath() + File.separator +
+ "IMG_"+ timeStamp + ".jpg");
+ } else if(type == MEDIA_TYPE_VIDEO) {
+ mediaFile = new File(mediaStorageDir.getPath() + File.separator +
+ "VID_"+ timeStamp + ".mp4");
+ } else {
+ return null;
+ }
+ return mediaFile;
+}
- private void releaseCamera(){
- if (camera != null){
- camera.release(); // release the camera for other applications
- camera = null;
- }
+private boolean prepareVideoRecorder(){
+ //mCamera = getCameraInstance();
+ mMediaRecorder = new MediaRecorder();
+ // Step 1: Unlock and set camera to MediaRecorder
+ mCamera.unlock();
+ mMediaRecorder.setCamera(mCamera);
+ // Step 2: Set sources
+ mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
+ mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
+ mMediaRecorder.setVideoSize(720, 480);
+ // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
+ mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
+ // Step 4: Set output file
+ mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());
+ // Step 5: Set the preview output
+ mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
+ // Step 6: Prepare configured MediaRecorder
+ try {
+ mMediaRecorder.prepare();
+ } catch (IllegalStateException e) {
+ Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
+ releaseMediaRecorder();
+ return false;
+ } catch (IOException e) {
+ Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
+ releaseMediaRecorder();
+ return false;
+ }
+ return true;
+}
+
+
+@Override
+public void onClick(View v) {
+ /*
+ Log.i("onClick", "BEGIN");
+ if(!recording) {
+ recording = startRecording();
+ } else {
+ stopRecording();
+ recording = false;
+ }
+ Log.i("onClick", "END");
+ */
+}
+
+@Override
+protected void onPause() {
+ super.onPause();
+ releaseMediaRecorder(); // if you are using MediaRecorder, release it first
+ releaseCamera(); // release the camera immediately on pause event
+}
+
+private void releaseMediaRecorder(){
+ if (mMediaRecorder != null) {
+ mMediaRecorder.reset(); // clear recorder configuration
+ mMediaRecorder.release(); // release the recorder object
+ mMediaRecorder = null;
+ mCamera.lock(); // lock camera for later use
}
+}
- private void resetCam() {
- camera.startPreview();
- preview.setCamera(camera);
- }
-/*
- ShutterCallback shutterCallback = new ShutterCallback() {
- public void onShutter() {
- // Log.d(TAG, "onShutter'd");
- }
- };
-
- PictureCallback rawCallback = new PictureCallback() {
- public void onPictureTaken(byte[] data, Camera camera) {
- // Log.d(TAG, "onPictureTaken - raw");
- }
- };
-
- PictureCallback jpegCallback = new PictureCallback() {
- public void onPictureTaken(byte[] data, Camera camera) {
- FileOutputStream outStream = null;
- try {
- // Write to SD Card
- fileName = String.format("/sdcard/camtest/%d.jpg", System.currentTimeMillis());
- outStream = new FileOutputStream(fileName);
- outStream.write(data);
- outStream.close();
- Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
-
- resetCam();
-
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- }
- Log.d(TAG, "onPictureTaken - jpeg");
- }
- };
- */
+private void releaseCamera(){
+ if (mCamera != null){
+ mCamera.release(); // release the camera for other applications
+ mCamera = null;
+ }
}
+
+ private Camera getCameraInstance(){
+ Camera c = null;
+ try {
+ c = Camera.open(); // attempt to get a Camera instance
+ //c = this.open(); // attempt to get a Camera instance
+ }
+ catch (Exception e){
+ // Camera is not available (in use or does not exist)
+ }
+ return c; // returns null if camera is unavailable
+ }
+
+ public Camera open() {
+ int numberOfCameras = Camera.getNumberOfCameras();
+ CameraInfo cameraInfo = new CameraInfo();
+ for (int i = 0; i < numberOfCameras; i++) {
+ Camera.getCameraInfo(i, cameraInfo);
+ if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
+ return Camera.open(i);
+ }
+ }
+ return null;
+ }
+} \ No newline at end of file
diff --git a/src/com/example/rotorm/Preview.java b/src/com/example/rotorm/Preview.java
index 5fdea5a..1fdf203 100644
--- a/src/com/example/rotorm/Preview.java
+++ b/src/com/example/rotorm/Preview.java
@@ -1,160 +1,69 @@
package com.example.rotorm;
import java.io.IOException;
-import java.util.List;
-
import android.content.Context;
import android.hardware.Camera;
-import android.hardware.Camera.Size;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
-import android.view.View;
-import android.view.ViewGroup;
-
-class Preview extends ViewGroup implements SurfaceHolder.Callback {
- private final String TAG = "Preview";
-
- SurfaceView mSurfaceView;
- SurfaceHolder mHolder;
- Size mPreviewSize;
- List<Size> mSupportedPreviewSizes;
- Camera mCamera;
- Preview(Context context, SurfaceView sv) {
- super(context);
+public class Preview extends SurfaceView implements SurfaceHolder.Callback {
- mSurfaceView = sv;
-// addView(mSurfaceView);
-
- mHolder = mSurfaceView.getHolder();
- mHolder.addCallback(this);
- mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- }
-
- public void setCamera(Camera camera) {
- mCamera = camera;
- if (mCamera != null) {
- mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
- requestLayout();
+private static final String TAG = "CameraPreview";
- // get Camera parameters
- Camera.Parameters params = mCamera.getParameters();
+private SurfaceHolder mHolder;
+private Camera mCamera;
- List<String> focusModes = params.getSupportedFocusModes();
- if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
- // set the focus mode
- params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
- // set Camera parameters
- mCamera.setParameters(params);
- }
- }
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- // We purposely disregard child measurements because act as a
- // wrapper to a SurfaceView that centers the camera preview instead
- // of stretching it.
- final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
- final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
- setMeasuredDimension(width, height);
+public Preview(Context context, Camera camera) {
+ super(context);
+ mCamera = camera;
+ // Install a SurfaceHolder.Callback so we get notified when the
+ // underlying surface is created and destroyed.
+ mHolder = getHolder();
+ mHolder.addCallback(this);
+ // deprecated setting, but required on Android versions prior to 3.0
+ mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+}
- if (mSupportedPreviewSizes != null) {
- mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
- }
+public void surfaceCreated(SurfaceHolder holder) {
+ // The Surface has been created, now tell the camera where to draw the preview.
+ try {
+ mCamera.setPreviewDisplay(holder);
+ mCamera.startPreview();
+ } catch (IOException e) {
+ Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
+}
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- if (changed && getChildCount() > 0) {
- final View child = getChildAt(0);
-
- final int width = r - l;
- final int height = b - t;
-
- int previewWidth = width;
- int previewHeight = height;
- if (mPreviewSize != null) {
- previewWidth = mPreviewSize.width;
- previewHeight = mPreviewSize.height;
- }
+public void surfaceDestroyed(SurfaceHolder holder) {
+ // empty. Take care of releasing the Camera preview in your activity.
+}
- // Center the child SurfaceView within the parent.
- if (width * previewHeight > height * previewWidth) {
- final int scaledChildWidth = previewWidth * height / previewHeight;
- child.layout((width - scaledChildWidth) / 2, 0,
- (width + scaledChildWidth) / 2, height);
- } else {
- final int scaledChildHeight = previewHeight * width / previewWidth;
- child.layout(0, (height - scaledChildHeight) / 2,
- width, (height + scaledChildHeight) / 2);
- }
- }
- }
+public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
+ // If your preview can change or rotate, take care of those events here.
+ // Make sure to stop the preview before resizing or reformatting it.
- public void surfaceCreated(SurfaceHolder holder) {
- // The Surface has been created, acquire the camera and tell it where
- // to draw.
- try {
- if (mCamera != null) {
- mCamera.setPreviewDisplay(holder);
- }
- } catch (IOException exception) {
- Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);
- }
+ if (mHolder.getSurface() == null){
+ // preview surface does not exist
+ return;
}
- public void surfaceDestroyed(SurfaceHolder holder) {
- // Surface will be destroyed when we return, so stop the preview.
- if (mCamera != null) {
- mCamera.stopPreview();
- }
+ // stop preview before making changes
+ try {
+ mCamera.stopPreview();
+ } catch (Exception e){
+ // ignore: tried to stop a non-existent preview
}
+ // make any resize, rotate or reformatting changes here
- private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
- final double ASPECT_TOLERANCE = 0.1;
- double targetRatio = (double) w / h;
- if (sizes == null) return null;
-
- Size optimalSize = null;
- double minDiff = Double.MAX_VALUE;
-
- int targetHeight = h;
-
- // Try to find an size match aspect ratio and size
- for (Size size : sizes) {
- double ratio = (double) size.width / size.height;
- if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
- if (Math.abs(size.height - targetHeight) < minDiff) {
- optimalSize = size;
- minDiff = Math.abs(size.height - targetHeight);
- }
- }
+ // start preview with new settings
+ try {
+ mCamera.setPreviewDisplay(mHolder);
+ mCamera.startPreview();
- // Cannot find the one match the aspect ratio, ignore the requirement
- if (optimalSize == null) {
- minDiff = Double.MAX_VALUE;
- for (Size size : sizes) {
- if (Math.abs(size.height - targetHeight) < minDiff) {
- optimalSize = size;
- minDiff = Math.abs(size.height - targetHeight);
- }
- }
- }
- return optimalSize;
+ } catch (Exception e){
+ Log.d(TAG, "Error starting camera preview: " + e.getMessage());
}
-
- public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
- if(mCamera != null) {
- Camera.Parameters parameters = mCamera.getParameters();
- parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
- requestLayout();
-
- mCamera.setParameters(parameters);
- mCamera.startPreview();
- }
- }
-
-}
+ }
+} \ No newline at end of file