blob: 4a8057d3f26b59cc9a6303846228fb67c2029639 [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.camera;
import java.io.IOException;
import android.annotation.TargetApi;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.hardware.Camera.ErrorCallback;
import android.hardware.Camera.OnZoomChangeListener;
import android.hardware.Camera.Parameters;
import android.os.Handler;
import android.view.SurfaceHolder;
import com.android.camera.util.ApiHelper;
/**
* An interface which provides possible camera device operations.
*
* The client should call {@code CameraManager.cameraOpen} to get an instance
* of {@link CameraManager.CameraProxy} to control the camera. Classes
* implementing this interface should have its own one unique {@code Thread}
* other than the main thread for camera operations. Camera device callbacks
* are wrapped since the client should not deal with
* {@code android.hardware.Camera} directly.
*
* TODO: provide callback interfaces for:
* {@code android.hardware.Camera.ErrorCallback},
* {@code android.hardware.Camera.OnZoomChangeListener}, and
* {@code android.hardware.Camera.Parameters}.
*/
public interface CameraManager {
/**
* An interface which wraps
* {@link android.hardware.Camera.AutoFocusCallback}.
*/
public interface CameraAFCallback {
public void onAutoFocus(boolean focused, CameraProxy camera);
}
/**
* An interface which wraps
* {@link android.hardware.Camera.AutoFocusMoveCallback}.
*/
public interface CameraAFMoveCallback {
public void onAutoFocusMoving(boolean moving, CameraProxy camera);
}
/**
* An interface which wraps
* {@link android.hardware.Camera.ShutterCallback}.
*/
public interface CameraShutterCallback {
public void onShutter(CameraProxy camera);
}
/**
* An interface which wraps
* {@link android.hardware.Camera.PictureCallback}.
*/
public interface CameraPictureCallback {
public void onPictureTaken(byte[] data, CameraProxy camera);
}
/**
* An interface which wraps
* {@link android.hardware.Camera.PreviewCallback}.
*/
public interface CameraPreviewDataCallback {
public void onPreviewFrame(byte[] data, CameraProxy camera);
}
/**
* An interface which wraps
* {@link android.hardware.Camera.FaceDetectionListener}.
*/
public interface CameraFaceDetectionCallback {
/**
* Callback for face detection.
*
* @param faces Recognized face in the preview.
* @param camera The camera which the preview image comes from.
*/
public void onFaceDetection(Camera.Face[] faces, CameraProxy camera);
}
/**
* Opens the camera of the specified ID synchronously.
*
* @param cameraId The camera ID to open.
* @return An instance of {@link CameraProxy} on success. null on failure.
*/
public CameraProxy cameraOpen(int cameraId);
/**
* An interface that takes camera operation requests and post messages to the
* camera handler thread. All camera operations made through this interface is
* asynchronous by default except those mentioned specifically.
*/
public interface CameraProxy {
/**
* Returns the underlying {@link android.hardware.Camera} object used
* by this proxy. This method should only be used when handing the
* camera device over to {@link android.media.MediaRecorder} for
* recording.
*/
public android.hardware.Camera getCamera();
/**
* Releases the camera device synchronously.
* This function must be synchronous so the caller knows exactly when the camera
* is released and can continue on.
*/
public void release();
/**
* Reconnects to the camera device.
*
* @see android.hardware.Camera#reconnect()
*/
public void reconnect() throws IOException;
/**
* Unlocks the camera device.
*
* @see android.hardware.Camera#unlock()
*/
public void unlock();
/**
* Locks the camera device.
* @see android.hardware.Camera#lock()
*/
public void lock();
/**
* Sets the {@link android.graphics.SurfaceTexture} for preview.
*
* @param surfaceTexture The {@link SurfaceTexture} for preview.
*/
@TargetApi(ApiHelper.VERSION_CODES.HONEYCOMB)
public void setPreviewTexture(final SurfaceTexture surfaceTexture);
/**
* Sets the {@link android.view.SurfaceHolder} for preview.
*
* @param surfaceHolder The {@link SurfaceHolder} for preview.
*/
public void setPreviewDisplay(final SurfaceHolder surfaceHolder);
/**
* Starts the camera preview.
*/
public void startPreview();
/**
* Stops the camera preview synchronously.
* {@code stopPreview()} must be synchronous to ensure that the caller can
* continues to release resources related to camera preview.
*/
public void stopPreview();
/**
* Sets the callback for preview data.
*
* @param handler handler in which the callback was handled.
* @param cb The callback to be invoked when the preview data is available.
* @see android.hardware.Camera#setPreviewCallback(android.hardware.Camera.PreviewCallback)
*/
public void setPreviewDataCallback(Handler handler, CameraPreviewDataCallback cb);
/**
* Sets the callback for preview data.
*
* @param handler The handler in which the callback will be invoked.
* @param cb The callback to be invoked when the preview data is available.
* @see android.hardware.Camera#setPreviewCallbackWithBuffer(android.hardware.Camera.PreviewCallback)
*/
public void setPreviewDataCallbackWithBuffer(Handler handler, CameraPreviewDataCallback cb);
/**
* Adds buffer for the preview callback.
*
* @param callbackBuffer The buffer allocated for the preview data.
*/
public void addCallbackBuffer(byte[] callbackBuffer);
/**
* Starts the auto-focus process. The result will be returned through the callback.
*
* @param handler The handler in which the callback will be invoked.
* @param cb The auto-focus callback.
*/
public void autoFocus(Handler handler, CameraAFCallback cb);
/**
* Cancels the auto-focus process.
*/
public void cancelAutoFocus();
/**
* Sets the auto-focus callback
*
* @param handler The handler in which the callback will be invoked.
* @param cb The callback to be invoked when the preview data is available.
*/
@TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN)
public void setAutoFocusMoveCallback(Handler handler, CameraAFMoveCallback cb);
/**
* Instrument the camera to take a picture.
*
* @param handler The handler in which the callback will be invoked.
* @param shutter The callback for shutter action, may be null.
* @param raw The callback for uncompressed data, may be null.
* @param postview The callback for postview image data, may be null.
* @param jpeg The callback for jpeg image data, may be null.
* @see android.hardware.Camera#takePicture(
* android.hardware.Camera.ShutterCallback,
* android.hardware.Camera.PictureCallback,
* android.hardware.Camera.PictureCallback)
*/
public void takePicture(
Handler handler,
CameraShutterCallback shutter,
CameraPictureCallback raw,
CameraPictureCallback postview,
CameraPictureCallback jpeg);
/**
* Sets the display orientation for camera to adjust the preview orientation.
*
* @param degrees The rotation in degrees. Should be 0, 90, 180 or 270.
*/
public void setDisplayOrientation(int degrees);
/**
* Sets the listener for zoom change.
*
* @param listener The listener.
*/
public void setZoomChangeListener(OnZoomChangeListener listener);
/**
* Sets the face detection listener.
*
* @param handler The handler in which the callback will be invoked.
* @param callback The callback for face detection results.
*/
@TargetApi(ApiHelper.VERSION_CODES.ICE_CREAM_SANDWICH)
public void setFaceDetectionCallback(Handler handler, CameraFaceDetectionCallback callback);
/**
* Starts the face detection.
*/
public void startFaceDetection();
/**
* Stops the face detection.
*/
public void stopFaceDetection();
/**
* Registers an error callback.
*
* @param cb The error callback.
* @see android.hardware.Camera#setErrorCallback(android.hardware.Camera.ErrorCallback)
*/
public void setErrorCallback(ErrorCallback cb);
/**
* Sets the camera parameters.
*
* @param params The camera parameters to use.
*/
public void setParameters(Parameters params);
/**
* Gets the current camera parameters synchronously. This method is
* synchronous since the caller has to wait for the camera to return
* the parameters. If the parameters are already cached, it returns
* immediately.
*/
public Parameters getParameters();
/**
* Forces {@code CameraProxy} to update the cached version of the camera
* parameters regardless of the dirty bit.
*/
public void refreshParameters();
/**
* Enables/Disables the camera shutter sound.
*
* @param enable {@code true} to enable the shutter sound,
* {@code false} to disable it.
*/
public void enableShutterSound(boolean enable);
}
}