package wb.android.camera;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Handler;
import android.util.Log;
import android.view.SurfaceHolder;
import java.io.IOException;
/**
* This class will perform all interactions with the device's camera
* @author WRB
*
*/
public final class CameraController {
//variables for logging
private static final String TAG = "CameraController";
private static final boolean D = true;
//message IDs
static final int FOCUS_SUCCEEDED = 1001;
static final int FOCUS_FAILED = 1002;
static final int REQUEST_PICTURE = 1003;
//instance variables
private Camera _camera;
private boolean _isPreviewing, _isStarted;
private HandledAutoFocusCallback _autoFocusCallback;
private JPGCallback _jpgCallback;
private int _rotation = 0;
CameraController(final Handler parentHandler) {
_camera = null;
_isPreviewing = false;
_isStarted = false;
_autoFocusCallback = new HandledAutoFocusCallback(parentHandler);
_jpgCallback = new JPGCallback(parentHandler);
}
final void setPreviewDisplay(final SurfaceHolder holder) {
try {
if (_camera != null)
_camera.setPreviewDisplay(holder);
}
catch (IOException e) {
Log.e(TAG, e.toString());
}
}
final void startPreview() {
if (D) Log.d(TAG, "Starting Camera Preview");
if (_camera != null && !_isPreviewing) {
_camera.startPreview();
_isPreviewing = true;
}
}
final void stopPreview() {
if (D) Log.d(TAG, "Stopping Camera Preview");
if (_camera != null && _isPreviewing) {
_camera.setPreviewCallback(null); //Not sure if this is needed
_camera.stopPreview();
_isPreviewing = false;
}
}
public final boolean startCamera(final CameraPreview preview) {
if (D) Log.d(TAG, "Starting Camera");
if (_camera == null) {
_camera = Camera.open();
_isStarted = true;
preview.setCameraController(this);
preview.requestLayout();
return true;
}
return false;
}
public final void stopCamera() {
if (D) Log.d(TAG, "Stopping Camera");
if (_camera != null) {
_isStarted = false;
_camera.stopPreview();
_camera.setPreviewCallback(null);
_camera.release(); //Since the camera is a shared resource, you have to release it
_camera = null;
}
}
public final void requestAutoFocus() {
if (_camera != null && _isPreviewing)
_camera.autoFocus(_autoFocusCallback);
}
public final void takePicture() {
if (_camera != null && _isPreviewing)
_camera.takePicture(null, null, _jpgCallback);
}
public final void setCameraRotation(final int degrees) {
if (_camera == null)
return;
if (degrees == 0 || degrees == 90 || degrees == 180 || degrees == 270) {
_rotation = degrees;
_camera.setDisplayOrientation(degrees);
}
else
Log.e(TAG, "Invalid Rotation Angle. Only 0, 90, 180, and 270 are allowed");
}
public final int getCameraRotation() {
return _rotation;
}
/**
* Use this to set optional camera parameters if desired
*/
public final void setCameraParams(final Parameters params) {
if (_camera != null && params != null) {
try {
_camera.setParameters(params);
}
catch (StringIndexOutOfBoundsException ex) {} //Android doesn't check if the Parameters HashMap is empty -> http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/hardware/Camera.java/?v=source
}
}
public final Parameters getCameraParams() {
if (_camera != null)
return _camera.getParameters();
else
return null;
}
public final boolean isStarted() {
return _isStarted;
}
}