Camera1

参考官方文档

Camera1在API级别21中弃用,建议使用Camera2

请求权限

1
2
3
 <uses-permission android:name =“android.permission.CAMERA”/>
 <uses-feature android:name =“android.hardware.camera”/>
 <uses-feature android:name =“android.hardware.camera.autofocus”/>

相关API

  • final void addCallbackBuffer(byte[] callbackBuffer) 将预分配的缓冲区添加到预览回调缓冲区队列中。
  • final void autoFocus(Camera.AutoFocusCallback cb) 启动相机自动对焦并注册回放功能以在相机对焦时运行。
  • final void cancelAutoFocus() 取消正在进行的任何自动对焦功能。
  • final boolean enableShutterSound(boolean enabled) 拍照时启用或禁用默认的快门声音。
  • static void getCameraInfo(int cameraId, Camera.CameraInfo cameraInfo)
  • 返回有关特定相机的信息。
  • static int getNumberOfCameras() 返回此设备上可用的物理照相机数量。
  • Camera.Parameters getParameters() 返回此Camera服务的当前设置。
  • final void lock() 重新锁定相机以防止其他进程访问它。
  • static Camera open() 创建一个新的Camera对象以访问设备上的第一个后置摄像头。
  • static Camera open(int cameraId) 创建一个新的Camera对象来访问特定的硬件摄像头。
  • final void reconnect() 在另一个进程使用它后重新连接到摄像机服务。
  • final void release() 断开并释放Camera对象资源。
  • void setAutoFocusMoveCallback(Camera.AutoFocusMoveCallback cb) 设置相机自动对焦移动回调。
  • final void setDisplayOrientation(int degrees) 以度为单位设置预览显示的顺时针旋转。
  • final void setErrorCallback(Camera.ErrorCallback cb) 注册发生错误时要调用的回调。
  • final void setFaceDetectionListener(Camera.FaceDetectionListener listener) 注册侦听器,以通知在预览帧中检测到的脸部。
  • final void setOneShotPreviewCallback(Camera.PreviewCallback cb) 除了将其显示在屏幕上之外,还安装一个回调以供下一个预览框调用。
  • void setParameters(Camera.Parameters params) 更改此相机服务的设置。
  • final void setPreviewCallback(Camera.PreviewCallback cb) 除了在屏幕上显示预览框之外,还安装要调用的每个预览框的回调。
  • final void setPreviewCallbackWithBuffer(Camera.PreviewCallback cb) addCallbackBuffer(byte[])除了在屏幕上显示外,还可以使用随附的缓冲区为每个预览帧安装一个回调。
  • final void setPreviewDisplay(SurfaceHolder holder) 设置Surface要用于实时预览。
  • final void setPreviewTexture(SurfaceTexture surfaceTexture) 设置SurfaceTexture要用于实时预览。
  • final void setZoomChangeListener(Camera.OnZoomChangeListener listener) 在平滑变焦过程中,当相机驱动程序更新变焦值时,注册收听者以通知收听者。
  • final void startFaceDetection() 开始脸部检测。
  • final void startPreview() 开始捕获和绘制预览帧到屏幕上。
  • final void startSmoothZoom(int value) 顺利放大所需的值。
  • final void stopFaceDetection() 停止脸部检测。
  • final void stopPreview() 停止捕捉和绘制预览帧到表面,并重置摄像机以供将来呼叫startPreview()。
  • final void stopSmoothZoom() 停止平滑缩放。
  • final void takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback postview, Camera.PictureCallback jpeg) 触发异步图像捕获。
  • final void takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg) 相当于takePicture(Shutter,raw,null,jpeg)
  • final void unlock() 解锁相机以允许其他进程访问它。

拍摄照片

  • 从中获取相机实例 open(int)
  • 获取现有(默认)设置 getParameters()
  • 如有必要,修改返回的Camera.Parameters对象并调用 setParameters(Camera.Parameters)
  • setDisplayOrientation(int)以确保预览的正确方向
  • 将完全初始化SurfaceHolder传递给 setPreviewDisplay(SurfaceHolder)。如果没有,相机将无法启动预览
  • startPreview()开始更新预览界面。必须先开始预览才能拍摄照片
  • takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)来拍摄一张照片。等待回调提供实际的图像数据(Camera.ShutterCallback:图像捕捉时刻的回调,或者为null,Camera.PictureCallback:原始(未压缩)图像数据的回调,或者为null,Camera.PictureCallback:postview图像数据的回调,可能为空,Camera.PictureCallback:JPEG图像数据的回调,或者为null)
  • 拍摄照片后,预览显示将停止。要拍摄更多照片,startPreview()
  • stopPreview()以停止更新预览表面
  • 应用程序在onPause()release()释放相机供其他应用程序使用。应用程序onResume()应重新open() 开启相机。

视频录制

  • 获取并初始化摄像头,按以上步骤开始预览
  • 调用unlock()以允许媒体进程访问相机
  • 调用MediaRecorder中的setCamera(Camera)方法,把相机传过去关联。
  • 完成录制后,调用reconnect()重新获取并重新锁定相机
  • 最后调用stopPreview()并release()释放相机

例子

1.打开相机

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
private boolean safeCameraOpen(int id) {
    boolean qOpened = false;

    try {
        releaseCameraAndPreview();
        mCamera = Camera.open(id);
        qOpened = (mCamera != null);
    } catch (Exception e) {
        Log.e(getString(R.string.app_name), "failed to open Camera");
        e.printStackTrace();
    }

    return qOpened;
}

private void releaseCameraAndPreview() {
    mPreview.setCamera(null);
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }
}

2.创建相机预览

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
预览类
class Preview extends ViewGroup implements SurfaceHolder.Callback {

    SurfaceView mSurfaceView;
    SurfaceHolder mHolder;

    Preview(Context context) {
        super(context);

        mSurfaceView = new SurfaceView(context);
        addView(mSurfaceView);

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = mSurfaceView.getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
...
}

设置并启动预览
public void setCamera(Camera camera) {
    if (mCamera == camera) { return; }

    stopPreviewAndFreeCamera();

    mCamera = camera;

    if (mCamera != null) {
        List<Size> localSizes = mCamera.getParameters().getSupportedPreviewSizes();
        mSupportedPreviewSizes = localSizes;
        requestLayout();

        try {
            mCamera.setPreviewDisplay(mHolder);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Important: Call startPreview() to start updating the preview
        // surface. Preview must be started before you can take a picture.
        mCamera.startPreview();
    }
}

3.修改相机设置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // Now that the size is known, set up the camera parameters and begin
    // the preview.
    Camera.Parameters parameters = mCamera.getParameters();
    parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
    requestLayout();
    mCamera.setParameters(parameters);

    // Important: Call startPreview() to start updating the preview surface.
    // Preview must be started before you can take a picture.
    mCamera.startPreview();
}

4. 拍照与重新预览

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
@Override
public void onClick(View v) {
    switch(mPreviewState) {
    case K_STATE_FROZEN:
        mCamera.startPreview();
        mPreviewState = K_STATE_PREVIEW;
        break;

    default:
        mCamera.takePicture( null, rawCallback, null);
        mPreviewState = K_STATE_BUSY;
    } // switch
    shutterBtnConfig();
}

5. 停止预览并释放相机

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public void surfaceDestroyed(SurfaceHolder holder) {
    // Surface will be destroyed when we return, so stop the preview.
    if (mCamera != null) {
        // Call stopPreview() to stop updating the preview surface.
        mCamera.stopPreview();
    }
}

/**
 * When this function returns, mCamera will be null.
 */
private void stopPreviewAndFreeCamera() {

    if (mCamera != null) {
        // Call stopPreview() to stop updating the preview surface.
        mCamera.stopPreview();

        // Important: Call release() to release the camera for use by other
        // applications. Applications should release the camera immediately
        // during onPause() and re-open() it during onResume()).
        mCamera.release();

        mCamera = null;
    }
}