前言
Camera1 在 API 21 的时候已经被弃用了,虽然现在google 都推荐 使用 Camerax 来实现相机的一些功能,但这不妨碍我们学习 Camera1 和 Camera2,对此有基础了解,为后续学习 Camera2 和 Camerax 做铺垫
本篇文章,你将学习到:
- 实现相机的开启与预览
- 调整预览方向
- 切换摄像头
- 拍照及调整图片方向
1. 效果图
2. 在清单文件中申请权限
3. 在 Java 代码中添加运行时权限授权,在 Activity 的 onCreate 函数中添加如下代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[] {Manifest.permission.CAMERA}, 1);
}
}
4. 布局文件
5. 获取相机个数 一般手机中,都有前置摄像头和后置摄像头,我们可以根据 Camera 的 getNumberOfCameras() 方法,来获取这些信息。比如:
/**
* 初始化相机
*/
private void initCamera() {
//获取相机个数
int numberOfCameras = Camera.getNumberOfCameras();
for (int i = 0; i height 的,而我们的UI是3:4,所以这里也要做换算
*
* @param shortSize
* @param longSize
*/
private void initPreviewParams(int shortSize, int longSize) {
Camera camera = mCamera;
if (camera != null) {
Camera.Parameters parameters = camera.getParameters();
//获取手机支持的尺寸
List sizes = parameters.getSupportedPreviewSizes();
Camera.Size bestSize = getBestSize(shortSize, longSize, sizes);
//设置预览大小
parameters.setPreviewSize(bestSize.width, bestSize.height);
//设置图片大小,拍照
parameters.setPictureSize(bestSize.width, bestSize.height);
//设置格式
parameters.setPreviewFormat(ImageFormat.NV21);
//设置自动聚焦
List modes = parameters.getSupportedFocusModes();
//查看支持的聚焦模式
for (String mode : modes) {
//默认图片聚焦模式
if (mode.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
break;
}
}
camera.setParameters(parameters);
}
}
8. 相机预览大小 首先,应该根据自己UI的大小去设置相机预览的大小,如果你的控件为 200x200,但相机的数据为 1920x1080 ,这样填充过去,画面肯定是会被拉伸的。
List sizes = parameters.getSupportedPreviewSizes()
注意相机的 width > height,所以获取一个最佳的预览尺寸可以这样写:
/**
* 获取预览最后尺寸
*
* @param shortSize
* @param longSize
* @param sizes
* @return
*/
private Camera.Size getBestSize(int shortSize, int longSize, List sizes) {
Camera.Size bestSize = null;
float uiRatio = (float) longSize / shortSize;
float minRatio = uiRatio;
for (Camera.Size previewSize : sizes) {
float cameraRatio = (float) previewSize.width / previewSize.height;
//如果找不到比例相同的,找一个最近的,防止预览变形
float offset = Math.abs(cameraRatio - minRatio);
if (offset = Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[] {Manifest.permission.CAMERA}, 1);
}
}
initCamera();
//打开摄像头
openCamera(mBackCameraId);
}
/**
* 初始化相机
*/
private void initCamera() {
//获取相机个数
int numberOfCameras = Camera.getNumberOfCameras();
for (int i = 0; i height 的,而我们的UI是3:4,所以这里也要做换算
*
* @param shortSize
* @param longSize
*/
private void initPreviewParams(int shortSize, int longSize) {
Camera camera = mCamera;
if (camera != null) {
Camera.Parameters parameters = camera.getParameters();
//获取手机支持的尺寸
List sizes = parameters.getSupportedPreviewSizes();
Camera.Size bestSize = getBestSize(shortSize, longSize, sizes);
//设置预览大小
parameters.setPreviewSize(bestSize.width, bestSize.height);
//设置图片大小,拍照
parameters.setPictureSize(bestSize.width, bestSize.height);
//设置格式
parameters.setPreviewFormat(ImageFormat.NV21);
//设置自动聚焦
List modes = parameters.getSupportedFocusModes();
//查看支持的聚焦模式
for (String mode : modes) {
//默认图片聚焦模式
if (mode.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
break;
}
}
camera.setParameters(parameters);
}
}
/**
* 获取预览最后尺寸
*
* @param shortSize
* @param longSize
* @param sizes
* @return
*/
private Camera.Size getBestSize(int shortSize, int longSize, List sizes) {
Camera.Size bestSize = null;
float uiRatio = (float) longSize / shortSize;
float minRatio = uiRatio;
for (Camera.Size previewSize : sizes) {
float cameraRatio = (float) previewSize.width / previewSize.height;
//如果找不到比例相同的,找一个最近的,防止预览变形
float offset = Math.abs(cameraRatio - minRatio);
if (offset
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?