Android 自定义Camera(四)翻转摄像头

Android 自定义Camera翻转摄像头

前言

Android camera开发中常常会涉及到 翻转摄像头,这篇问篇文章会为大家讲解如何翻转摄像头。

官方api

在这里插入图片描述
在这里插入图片描述

open和open(int arg)的关系

在之前的文章中,我们使用open()成功获取到了后置摄像头,大家有没有好奇,为什么是后置摄像头而不是前置呢,我们一起看一下open()的实现
在这里插入图片描述
解释一下:
第一步,获取到设备的硬件层的摄像头数量
在这里插入图片描述
第二部,创建一个Info容器
第三步,遍历摄像头
为info赋值,如果info的id == CAMERA_FACING_BACK则返回Camera对象,否则return null.
在这里插入图片描述在这里插入图片描述
open(int org)的实现
在这里插入图片描述
可以看到open(int org),省略了open()类的遍历判断,完全信任了调用者的传参。
思考一下:
首先,Camera为我们定义了CAMERA_FACING_BACK,CAMERA_FACING_FRONT,后置摄像头和前置摄像头的ID,那么系统为什么要遍历所有摄像头呢,
这说明了硬件层可能不包含任何摄像头,所以在操作open(int arg)时需要提前判断,硬件层面是否包含前置或者后置摄像头。
感兴趣的朋友可以看一下华为荣耀i7(单摄像头设备)

切换摄像头的具体实现

第一步,定义一个全局变量来记录当前的相机ID

    private int cameraType = Camera.CameraInfo.CAMERA_FACING_BACK;

第二步,定义一个函数用来获取摄像头

public static Camera getCamera(int cameraType) {
        int numberOfCameras = Camera.getNumberOfCameras();
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        for (int i = 0; i < numberOfCameras; i++) {
            getCameraInfo(i, cameraInfo);
            if (cameraInfo.facing == cameraType) {
                return Camera.open(i);
            }
        }
        return null;
    }

第二部,在点击按钮的响应

/**
                 * 判断Camera状态,为空则重新初始化
                 */
                if(null != mCamera) {
                    /**
                     * 实例化新Camera之前需要释放掉之前实例化的Camera,否则会出现异常,
                     * 但并不是所有的设备都会出现异常
                     */
                    mCamera.stopPreview();
                    mCamera.release();
                    mCamera = null;
                    Camera camera = getCamera(cameraType == Camera.CameraInfo.CAMERA_FACING_BACK
                    ? Camera.CameraInfo.CAMERA_FACING_FRONT
                            :Camera.CameraInfo.CAMERA_FACING_BACK);
                    if(null != camera) {
                        cameraType = cameraType == Camera.CameraInfo.CAMERA_FACING_BACK
                                ? Camera.CameraInfo.CAMERA_FACING_FRONT
                                :Camera.CameraInfo.CAMERA_FACING_BACK;
                        mCamera = camera;

                        mCamera.setDisplayOrientation(90);
                        setCameraSize(mCamera,
                                ScreenUtils.getScreenHeight(this)
                                , ScreenUtils.getScreenWidth(this));
                        try {
                            mCamera.setPreviewDisplay(mPreview.getHolder());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        mCamera.startPreview();
                    } else {
                        initCamera();
                        try {
                            mCamera.setPreviewDisplay(mPreview.getHolder());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        mCamera.startPreview();
                    }
                } else {
                    initCamera();
                }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中实现仿微信视频通话翻转摄像头的功能,需要借助Camera2 API来控制摄像头的操作。 首先,我们需要判断设备是否支持Camera2 API。可以通过检查设备的特性来确定是否支持。然后,根据摄像头的切换方式,可以选择使用前置或后置摄像头。 在使用Camera2 API之前,需要申请摄像头的权限。在AndroidManifest.xml文件中添加相应的权限声明。 接下来,需要创建一个CameraManager来管理设备的摄像头。可以使用CameraManager.getCameraIdList()方法获取所有可用的摄像头ID。 然后,通过调用CameraManager.openCamera()方法来打开所选摄像头。在回调函数中,我们可以获取到CameraDevice对象,用于后续的摄像头操作。 在进行摄像头切换时,需要先关闭当前正在使用的摄像头,然后再打开另一个摄像头。可以使用CameraDevice.close()方法来关闭摄像头。 切换摄像头时,需要修改预览的SurfaceTexture对象,以显示摄像头的实时画面。可以使用CameraDevice.createCaptureSession()方法来创建预览会话。 在预览会话成功创建后,可以使用CameraCaptureSession.setRepeatingRequest()方法开始预览或录制视频。 当需要切换摄像头时,可以按照上述步骤依次进行操作。在切换完成后,即可实现仿微信视频通话翻转摄像头的功能。 需要注意的是,Camera2 API在不同的Android版本上有所差异,开发时需要根据目标设备的API级别来选择兼容的接口和方法。可以使用Support库来兼容不同版本的API。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值