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/CameraActivity.java | |
| parent | 2cb2cb16fe9165d70260a7a5aa8f0fd7f09d14e9 (diff) | |
still tinkering
Diffstat (limited to 'src/com/example/rotorm/CameraActivity.java')
| -rw-r--r-- | src/com/example/rotorm/CameraActivity.java | 380 |
1 files changed, 216 insertions, 164 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 |
