Android--Camera2的学习

最近在学习有关人脸识别的闸机系统,对用到的知识点进行总结.
Android5.0后就弃用了Camera1,而Camera1和Camera2的差别还是很大的,Camera2提供了很多新特性.本文使用Camera2实现了相机预览,拍照等功能.
开发工具:AS 3.4.1 真机:荣耀10

以下是部分重要代码,文章最后附有完整的Demo地址.

主要的api:
1.CameraManager:摄像头管理者,用于检测、描述和连接到照相机设备;
2.CameraCharacteristics:摄像头的属性信息,可以获取摄像头的FPS,支持尺寸等属性;
3.CameraDevice:表示摄像头设备;
4.CameraCaptureSession:相机捕捉会话,通过setRepeatingRequest不断请求捕捉图像;
5.ImageReader.OnImageAvailableListener中的onImageAvailable:获取预览的图像数据,可进行转化,保存图像等操作.

主要流程:
预览流程
1.使用TextureView作为载体展示预览内容,
2.动态申请权限,权限通过后进行视图的初始化,遍历摄像头,创建工作线程,以及监听SurfaceTexture的状态;
这里的匿名内部类用到了jdk8的新特性Lambda表达式(后面写个关于Lambda的博客)
权限模板可参考我另一边博客:https://blog.csdn.net/sunyFS/article/details/98175130

        //java 1.8的Lambda表达式
        setPermissions(mPermissions, () -> {
            Toast.makeText(MainActivity.this, "权限已全部允许,可进行初始化操作", Toast.LENGTH_SHORT).show();
            initView();
            initLooper();
        });
    }
    private void initView() {
        btn_switch = findViewById(R.id.btn_switch);
        ttvPreview = findViewById(R.id.ttvPreview);
        btn_switch.setOnClickListener(this);
        //遍历摄像头,检查摄像头是否可用,以及获取摄像头支持的尺寸,FPS等属性
        cameraList();
        //监听SurfaceTexture状态,SurfaceTexture可用时回调onSurfaceTextureAvailable方法
        ttvPreview.setSurfaceTextureListener(this);
    }
  private void initLooper() {
        //创建HandlerThread,用"CAMERA2"标记
        mThreadHandler = new HandlerThread("CAMERA2");
        //启动线程
        mThreadHandler.start();
        //创建工作线程Handler
        mHandler = new Handler(mThreadHandler.getLooper());
    }

3.遍历摄像头cameraList(),这里我默认使用后置摄像头mCameraId = mBackCameraId;
通过getSystemService(Context.CAMERA_SERVICE);获取摄像头的管理者cameraManager,
foreach遍历所有的摄像头:
CameraMetadata.LENS_FACING_BACK为后置摄像头,也可以用字符串"0"表示;
CameraMetadata.LENS_FACING_FRONT为前置摄像头"1";

cameraManager.getCameraCharacteristics(cameraId);传入指定id获取该摄像头的characteristics,
通过CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES字段获取支持的FPS(前后摄像头一样);
通过CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP字段获取设备支持的预览尺寸;

预览尺寸指相机把画面输出到手机屏幕上供用户预览的尺寸,一般手机都会支持多个不同尺寸供用户选择,通常在不超过手机分辨率下,选择越大的尺寸,预览画面越清晰.
(荣耀10 分辨率为2280x1080,我选择map.ge

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,很高兴回答你关于Android开发中的相机(Camera)学习问题。在Android开发中,相机是一个非常常见的模块,因此学习如何使用相机是非常重要的一部分。 首先,你需要在AndroidManifest.xml中声明相机权限: ```xml <uses-permission android:name="android.permission.CAMERA" /> ``` 接着,在你的Activity中,你需要获取相机的实例并启动预览: ```java private Camera mCamera; private void startCameraPreview() { try { mCamera = Camera.open(); Camera.Parameters parameters = mCamera.getParameters(); // 设置相关参数 mCamera.setParameters(parameters); // 设置预览SurfaceView mCamera.setPreviewDisplay(mSurfaceView.getHolder()); // 开启预览 mCamera.startPreview(); } catch (IOException e) { Log.e(TAG, "Error while setting camera preview", e); } } ``` 上面的代码中,我们首先获取系统相机的实例,然后获取相机参数,并设置相关参数。接着,我们将预览SurfaceView和相机绑定,最后开启预览。 当你完成相机预览后,你就可以使用相机拍照了。以下是拍照的示例代码: ```java private void takePicture() { mCamera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // 处理拍照后的数据 } }); } ``` 当你调用`takePicture()`方法时,相机会拍摄一张照片,并通过PictureCallback返回照片的数据。你可以将数据保存到文件中,或者进行进一步的处理,比如将照片显示在ImageView中。 以上就是Android开发中相机的基本使用方法。当然,相机的功能还有很多,你可以尝试更多的参数设置和拍照处理,来发掘相机的更多特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值