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; } } |