在上一篇博客中介绍了使用intent拍照,接下来叙述利用Camera API实现自主设置相机参数进行设计以实现更加强大的功能。
private static CameraManager sCameraManager = new CameraManager();
private final PreviewCallback mPreviewCallback;(实时处理摄像头预览帧数据)
public static CameraManager get() {
return sCameraManager;
}
public boolean startPreview()
import android.hardware.Camera;
import android.os.Handler;
import android.view.SurfaceHolder;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
*此对象包装相机服务对象,并期望是唯一一个与之对话的对象。
*实施封装采取预览大小的图像所需的步骤,用于预览和解码。
*/
public final class CameraManager {
private static CameraManager sCameraManager;
private final CameraConfigurationManager mConfigManager;
/**
*预览回调,我们传递给注册处理程序。请务必清除处理程序
*它只接收一条消息。
*/
private final PreviewCallback mPreviewCallback;
/** 自动聚焦回调到达这里,并被发送到请求它们的处理程序。 */
private final AutoFocusCallback mAutoFocusCallback;
private Camera mCamera;
private boolean mInitialized;
private boolean mPreviewing;
private boolean useAutoFocus;
private CameraManager() {
this.mConfigManager = new CameraConfigurationManager();
mPreviewCallback = new PreviewCallback(mConfigManager);
mAutoFocusCallback = new AutoFocusCallback();
}
/**
* 用调用活动的上下文初始化这个静态对象。
*/
public static void init() {
if (sCameraManager == null) {
sCameraManager = new CameraManager();
}
}
/**
* 获取CameraManager的实例。
*
* @return 给摄影师的参考。
*/
public static CameraManager get() {
return sCameraManager;
}
/**
* 打开相机驱动程序并初始化硬件参数。
*
* @param holder mCamera将绘制的预览帧的表面对象。
* @throws IOException 指示未能打开mCamera驱动程序。
*/
public boolean openDriver(SurfaceHolder holder) throws IOException {
if (mCamera == null) {
try {
mCamera = Camera.open();
if (mCamera != null) {
Camera.Parameters mParameters = mCamera.getParameters();
mCamera.setParameters(mParameters);
mCamera.setPreviewDisplay(holder);
String currentFocusMode = mCamera.getParameters().getFocusMode();
useAutoFocus = FOCUS_MODES_CALLING_AF.contains(currentFocusMode);
if (!mInitialized) {
mInitialized = true;
mConfigManager.initFromCameraParameters(mCamera);
}
mConfigManager.setDesiredCameraParameters(mCamera);
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 关闭mCamera,如果仍在使用中。
*/
public boolean closeDriver() {
if (mCamera != null) {
try {
mCamera.release();
mInitialized = false;
mPreviewing = false;
mCamera = null;
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 打开或关闭闪光灯
*
* @param open 控制是否打开
* @return 打开或关闭失败,则返回false。
*/
public boolean setFlashLight(boolean open) {
if (mCamera == null || !mPreviewing) {
return false;
}
Camera.Parameters parameters = mCamera.getParameters();
if (parameters == null) {
return false;
}
List flashModes = parameters.getSupportedFlashModes();
// Check if camera flash exists
if (null == flashModes || 0 == flashModes.size()) {
// Use the screen as a flashlight (next best thing)
return false;
}
String flashMode = parameters.getFlashMode();
if (open) {
if (Camera.Parameters.FLASH_MODE_TORCH.equals(flashMode)) {
return true;
}
// Turn on the flash
if (flashModes.contains(Camera.Parameters.FLASH_MODE_TORCH)) {
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(parameters);
return true;
} else {
return false;
}
} else {
if (Camera.Parameters.FLASH_MODE_OFF.equals(flashMode)) {
return true;
}
// Turn on the flash
if (flashModes.contains(Camera.Parameters.FLASH_MODE_OFF)) {
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
mCamera.setParameters(parameters);
return true;
} else {
return false;
}
}
}
/**
* 要求mCamera硬件开始将预览帧绘制到屏幕上
*/
public boolean startPreview() {
if (mCamera != null && !mPreviewing) {
try {
mCamera.startPreview();
mPreviewing = true;
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 告诉mCamera停止绘制预览帧。
*/
public boolean stopPreview() {
if (mCamera != null && mPreviewing) {
try {
// 停止预览时把callback移除.
mCamera.setOneShotPreviewCallback(null);
mCamera.stopPreview();
mPreviewCallback.setHandler(null, 0);
mAutoFocusCallback.setHandler(null, 0);
mPreviewing = false;
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 将一个预览帧返回给提供的处理程序。这些数据将在message obj字段中以byte[]的形式到达,宽度和高度分别被编码为消息。
*
* @param handler 将消息发送到的处理程序。
* @param message 要发送的消息的哪个字段。
*/
public void requestPreviewFrame(Handler handler, int message) {
if (mCamera != null && mPreviewing) {
mPreviewCallback.setHandler(handler, message);
mCamera.setOneShotPreviewCallback(mPreviewCallback);
}
}
/**
* 要求mCamera执行自动对焦。
*
* @param handler 当自动对焦完成时通知的处理程序。
* @param message 传递的信息。
*/
public void requestAutoFocus(Handler handler, int message) {
if (mCamera != null && mPreviewing) {
mAutoFocusCallback.setHandler(handler, message);
// Log.d(TAG, "Requesting auto-focus callback");
if (useAutoFocus) {
try {
mCamera.autoFocus(mAutoFocusCallback);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public void takeShot(Camera.ShutterCallback shutterCallback,
Camera.PictureCallback rawPictureCallback,
Camera.PictureCallback jpegPictureCallback ){
mCamera.takePicture(shutterCallback, rawPictureCallback, jpegPictureCallback);
}
private static final Collection FOCUS_MODES_CALLING_AF;
static {
FOCUS_MODES_CALLING_AF = new ArrayList(2);
FOCUS_MODES_CALLING_AF.add(Camera.Parameters.FOCUS_MODE_AUTO);
FOCUS_MODES_CALLING_AF.add(Camera.Parameters.FOCUS_MODE_MACRO);
}
}
里面还包含了自动对焦和摄影制图管理的类,如果有机会后再后续博客上发布。