Camera1 API虽在Android5.0后逐渐被Camera2所取代,但部分安卓设备版本低、对Camera2的底层驱动并不完善亦或是历史原因导致的开发成本差异,让其到目前仍然未被淘汰。
权限申请
<!-- 相机权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 存储权限(保存照片用) -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus" />
动态获取权限:
开启摄像头

注:当摄像头开启未关闭,会触发异常报错
Camera.setDisplayOrientation()设置摄像头旋转角度。
相机参数配置
参数配置是Camera1调用的重中之重,其通过Camera.getParameters()获取参数对象、修改属性属性后调用Camera.setParamers(param)完成配置生效。
|
预览分辨率 |
getSupportedPreviewSizes()获得摄像头支持的预览分辨率,选择摄像头所支持的分辨率,且需保证与画布比例保持一致,防止图像拉伸。通过param.setPreviewSize(width,height)完成配置 |
|
拍照分辨率 |
getSupportedPictureSizes()获的摄像头支持的拍照分辨率。通过param.setPictureSize(width, height)完成配置。 |
|
图像格式 |
param.setPictureFormat(ImageFormat.JPEG)默认为JPEG param.setPreviewFormat(format)常见的为ImageForamt.NV21和YV12 |
|
图像压缩质量 |
param.setJpegQuality(80)这个值通常为0-100,值越大图像质量越好、图像越大 |
|
对焦模式 |
getSupportedFocusModes()获得
param.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO)完成配置。 也可通过param.setFocusAreas(areas)完成手动聚焦(通过SurfaceView的触摸监听返回点击落点位置,将其值传入
) |
|
白平衡 |
用于矫正画满色温 param.getSupportedWhiteBalance()获取支持的模式
param.setWhiteBalance() |
|
闪光灯 |
param.setFlashMode(Parameters.FLASH_MODE_OFF) |
|
缩放 |
param.setZoom() |
|
预览帧率 |
param.setPreviewFpsRange(min, max) |
|
场景模式 |
param.setSceneMode() |
|
色彩效果 |
param.setColorEffect() Camera.Parameters.EFFECT_MONO 黑白 Camera.Parameters.EFFECT_NONE 无效果 |
|
。。。 |
|
最后通过camera.setParameters(param)完成配置。注意,由于兼容性问题,当设备不支持配置项时会发生配置失败,需放入trycatch中。
预览容器设置

mSurfaceView = (SurfaceView) findViewById(R.id.camera);
mSurfaceView.getHolder().addCallback(surfaceCallback);
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {//主线程回调
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
camera.setPreviewDisplay(surfaceView.getHolder());
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {//主线程回调
camera.stopPreview();
camera.release();
camera = null;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
};
完成
开启预览camera.startPreview();
调用系统相机完成拍照
mCamera.takePicture(null, null, jpegCallback)
预览数据获得
通过setPreviewCallbackWithBuffer(callback)设置循环回调的预览帧监听,实时获取数据。通常与addCallbackBuffer配合使用,避免频繁创建数组。


addCallbackBuffer也可以添加多个已避免单缓冲区卡顿。



5875






