blob: 909e1ca75e143177d95e631395fe4bdd7e654cf2 [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 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.Build;
import android.os.Handler;
import android.view.SurfaceHolder;
/**
* 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);
}
/**
* An interface to be called for any exception caught when opening the
* camera device. This error callback is different from the one defined
* in the framework, {@link android.hardware.Camera.ErrorCallback}, which
* is used after the camera is opened.
*/
public interface CameraOpenErrorCallback {
/**
* Callback when {@link com.android.camera.CameraDisabledException} is
* caught.
*
* @param cameraId The disabled camera.
*/
public void onCameraDisabled(int cameraId);
/**
* Callback when {@link com.android.camera.CameraHardwareException} is
* caught.
*
* @param cameraId The camera with the hardware failure.
*/
public void onDeviceOpenFailure(int cameraId);
/**
* Callback when {@link java.io.IOException} is caught during
* {@link android.hardware.Camera#reconnect()}.
*
* @param mgr The {@link com.android.camera.CameraManager}
* with the reconnect failure.
*/
public void onReconnectionFailure(CameraManager mgr);
}
/**
* Opens the camera of the specified ID synchronously.
*
* @param handler The {@link android.os.Handler} in which the callback
* was handled.
* @param callback The callback when any error happens.
* @param cameraId The camera ID to open.
* @return An instance of {@link CameraProxy} on success. null on failure.
*/
public CameraProxy cameraOpen(
Handler handler, int cameraId, CameraOpenErrorCallback callback);
/**
* 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()
*
* @param handler The {@link android.os.Handler} in which the callback
* was handled.
* @param cb The callback when any error happens.
* @return {@code false} on errors.
*/
public boolean reconnect(Handler handler, CameraOpenErrorCallback cb);
/**
* 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.
*/
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 The {@link android.os.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(Build.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.
*/
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);
}
}