一、Camera2 操作android.hardware.Camera 分析

本文深入剖析了Android系统中相机模块的工作原理,从CameraHolder类的单例模式到CameraManager接口及其实现,再到CameraProxy接口的功能介绍。同时,还探讨了自动对焦、拍照等关键操作的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



android.hardware.Camera    路径:frameworks/base/core/java/android/hardware/Camera.java
作为承上启下的作用。一些底层接口释放给上层应用。
1、    CameraHolder
这个类是为了保持“android.hardware.Camera”的实例。
这是用于不同模块之间的切换。
这个类在Camera应用里,是典型的单例模式。

方法:
(1)    public static synchronized CameraHolder instance() {
        if (sHolder == null) {
            sHolder = new CameraHolder();
        }
        return sHolder;
            }
            说明:创建单实例,如果实例sHolder 已经存在。那么就直接返回。否则就重新创建一个。
(2)     构造函数里面的语句
{
        HandlerThread ht = new HandlerThread("CameraHolder");
        ht.start();
        mHandler = new MyHandler(ht.getLooper());
//获取Camera数量
        mNumberOfCameras = android.hardware.Camera.getNumberOfCameras();
        mInfo = new CameraInfo[mNumberOfCameras];
        for (int i = 0; i < mNumberOfCameras; i++) {
            mInfo[i] = new CameraInfo();
            android.hardware.Camera.getCameraInfo(i, mInfo[i]);
        }

        // get the first (smallest) back and first front camera id
        for (int i = 0; i < mNumberOfCameras; i++) {
            if (mBackCameraId == -1 && mInfo[i].facing == CameraInfo.CAMERA_FACING_BACK) {
                mBackCameraId = i;
            } else if (mFrontCameraId == -1 && mInfo[i].facing == CameraInfo.CAMERA_FACING_FRONT) {
                mFrontCameraId = i;
            }
        }        
(3)    Open  方法
通过语句:
mCameraDevice = CameraManagerFactory
                    .getAndroidCameraManager().cameraOpen(handler, cameraId, cb);
来调用android.hardware.Camera 打开Camera 设备。
(4)    release()
关闭Camera的时候,调用release

2、    CameraManager 接口和AndroidCameraManagerImpl类
接口,为Camera设备提供操作的方法。这个接口的实现类是AndroidCameraManagerImpl
在这个接口里,只声明了一个方法。
    public CameraProxy cameraOpen(
            Handler handler, int cameraId, CameraOpenErrorCallback callback);
目的就是打开Camera设备。

在这个接口里面还声明多个内部的接口下面详细介绍。

3、    CameraProxy 接口 和AndroidCameraProxyImpl类
这个接口就是将对Camera 接受和发送的操作,送达到Camera设备。除了一些特殊的方法外,其他方法都是默认为异步操作。
这个接口的实现类是AndroidCameraProxyImpl,这个类属于AndroidCameraManagerImpl的内部类。在AndroidCameraManagerImpl.java 里面还有一个内部类CameraHandler,这个类属于Handler。在CameraHandler的handleMessage方法里,就是根据不同的消息参数来对android.hardware.Camera 进行控制。比如打开,释放,对焦,变焦等等

4、    CameraAFCallback 接口和AutoFocusCallback类
自动对焦回调的接口。此接口实现在PhotoModule类里面的内部类AutoFocusCallback实现。并且传给AndroidCameraProxyImpl的实例的autoFocus方法。然后调用CameraHandler 类里面的handleMessage方法,传给android.hardware.Camera 。
5、    CameraShutterCallback 接口 和 ShutterCallback 类
拍照的接口。
6、    CameraPictureCallback 接口和 PostViewPictureCallback,RawPictureCallback,JpegPictureCallback类
拍照后,将相片图片保存。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值