CameraAppFramework流程之OpenCamera

本文深入探讨Android相机应用框架,重点在于如何通过CameraManager打开相机,并详细解析Camera2Client、CameraDeviceClient及Camera3Device在CameraManager.OpenCamera过程中的作用。同时,介绍了CameraDevice.StateCallback的相关回调机制。

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

APP 到 Framework 阶段

CameraManager.java

谷歌将CameraManager定义为一个系统服务,通过 Context.getService 来获取(Context.CAMERA_SERVICE),主要用于检测以及打开系统相机,通过 OpenCamera 方法来打开相机;此外,还定义了 getCameraCharacteristics 方法来获取当前 Camera 设备支持的属性信息,该属性信息通过 CameraCharacteristics 来表示,其中包括了图像数据的大小以及帧率等信息

manager.openCamera(cameraId, callback, handler);

openCamera(@NonNull String cameraId,
            @NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler)
openCameraForUid(cameraId, callback, CameraDeviceImpl.checkAndWrapHandler(handler),
                USE_CALLING_UID);
openCameraForUid(cameraId, callback, executor, clientUid, /*oomScoreOffset*/0);

openCameraDeviceUserAsync(cameraId, callback, executor, clientUid, oomScoreOffset){
    
    ICameraDeviceUser cameraUser = null;
    
    android.hardware.camera2.implCameraDeviceImpl deviceImpl = new     android.hardware.camera2.impl.CameraDeviceImpl(
        cameraId, callback, executor, characteristics, physicalIdsToChars, mContext.getApplicationInfo().targetSdkVersion, mContext)
    
    ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
    

    //这一步开始去链接设备
    cameraUser = cameraService.connectDevice(callbacks, cameraId, mContext.getOpPackageName(), mContext.getAttributionTag(), uid, oomScoreOffset, mContext.getApplicationInfo().targetSdkVersion)
    
    deviceImpl.setRemoteDevice(cameraUser)
    return deviceImpl
};

CaneraService.cpp

Status CameraService::connectDevice(const sp<hardware::camera2::ICameraDeviceCallbacks>& cameraCb, const String16& cameraId, const String16& clientPackageName, int clientUid){
    sp<CameraDeviceClient> client = nullptr;
    ret = connectHelper<hardware::camera2::ICameraDeviceCallBacks, CameraDeviceClient>(cameraCb, id,/*api1CameraId*/ -1, CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageName, /*legacyMode*/ false, /*shimUpdateOnly*/ false, /*out*/ client);
}

Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8& cameraId, int api1CameraId, int halVersion, const String16& clientPackageName, int clientUid, int clientPid, apiLevel effectiveApiLevel, bool legacyMode, bool shimUpdateOnly, /*out*/ sp<CLIENT>& device){
        
    ALOGI("CameraService::connect call (PI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值