Camera Open 流程源码分析

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

1.app层 MainActivity.java CameraManager 可以直接调用 其openCamera 方法

getCameraIdList 用来存储可用Camera设备 list, openCamera 成功后会调用CameraDevice.StateCallback#onOpened,

然后会创建Session CameraDevice#createCaptureSession 以及拍照CameraDevice#createCaptureRequest等等。

public class MainActivity extends AppCompatActivity {

    protected void onCreate(@Nullable Bundle savedInstanceState) {

    ... ...
    //
    CameraManager mCameraManager.openCamera(mCameraId, mStateCallback, mBackgroundHandler);
    ... ...
    
    }
  

2.CameraManager.java
(frameworks\base\core\java\android\hardware\camera2)

CameraManager 会根据传递过来的参数不同,调用不同的Opencamera 方法。


    @RequiresPermission(android.Manifest.permission.CAMERA)
    public void openCamera(@NonNull String cameraId,
            @NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler)
            throws CameraAccessException {

        openCameraForUid(cameraId, callback, CameraDeviceImpl.checkAndWrapHandler(handler),
                USE_CALLING_UID);
    }
    // CameraDeviceImpl.checkAndWrapHandler 会将 Handler 封装成Executor 类型 
    public static Executor checkAndWrapHandler(Handler handler) {
        return new CameraHandlerExecutor(checkHandler(handler));
    }
    
    @RequiresPermission(android.Manifest.permission.CAMERA)
    public void openCamera(@NonNull String cameraId,
            @NonNull @CallbackExecutor Executor executor,
            @NonNull final CameraDevice.StateCallback callback)
            throws CameraAccessException {
        
        openCameraForUid(cameraId, callback, executor, USE_CALLING_UID);
    }
    

从代码中看,openCamera 参数主要区别是 CallbackExecutor 、Handler 这两个,最终都会走到 openCameraForUid 方法。
openCameraForUid 主要是 根据 Camera id 打开一个Camera 连接。

    public void openCameraForUid(@NonNull String cameraId,
            @NonNull final CameraDevice.StateCallback callback, @NonNull Executor executor,
            int clientUid)
            throws CameraAccessException {
            // 
            openCameraDeviceUserAsync(cameraId, callback, executor, clientUid);
            
    }


openCameraForUid 会调用 openCameraDeviceUserAsync 方法去帮助opencamera 连接的创建

    private CameraDevice openCameraDeviceUserAsync(String cameraId,
            CameraDevice.StateCallback callback, Executor executor, final int uid)
            throws CameraAccessException {
            // 获取 特定camera的特性
            CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
            
            android.hardware.camera2.impl.CameraDeviceImpl deviceImpl = new  CameraDeviceImpl();
            ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks()
            
              if (supportsCamera2ApiLocked(cameraId)) {
                    // Use cameraservice's cameradeviceclient implementation for HAL3.2+ devices
                    
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值