diff options
| author | Tim Redfern <tim@eclectronics.org> | 2013-09-10 17:47:51 +0100 |
|---|---|---|
| committer | Tim Redfern <tim@eclectronics.org> | 2013-09-10 17:47:51 +0100 |
| commit | dbfb1ee34c1e6e244f656205d68a1e5527214ef1 (patch) | |
| tree | 497228fc209f843d0606d6afdb5768042a91eba7 /src/com/example/rotorm | |
| parent | 2cb2cb16fe9165d70260a7a5aa8f0fd7f09d14e9 (diff) | |
still tinkering
Diffstat (limited to 'src/com/example/rotorm')
| -rw-r--r-- | src/com/example/rotorm/CameraActivity.java | 380 | ||||
| -rw-r--r-- | src/com/example/rotorm/Preview.java | 181 |
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 |
