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