在上一篇博客中介绍了使用intent拍照,接下来叙述利用Camera API实现自主设置相机参数进行设计以实现更加强大的功能。
1. 获取指定摄像头并设置参数
private static CameraManager sCameraManager = new CameraManager();
2. 设置预览界面
private final PreviewCallback mPreviewCallback;(实时处理摄像头预览帧数据)
3. 打开相机驱动程序并初始化硬件参数。
public boolean openDriver(SurfaceHolder holder)
4. 拍照
public static CameraManager get() {
return sCameraManager;
}
5.显示
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<String> 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<String> FOCUS_MODES_CALLING_AF; static { FOCUS_MODES_CALLING_AF = new ArrayList<String>(2); FOCUS_MODES_CALLING_AF.add(Camera.Parameters.FOCUS_MODE_AUTO); FOCUS_MODES_CALLING_AF.add(Camera.Parameters.FOCUS_MODE_MACRO); } }里面还包含了自动对焦和摄影制图管理的类,如果有机会后再后续博客上发布。