Android P之Camera HAL3流程分析(1)

本文详细分析了Android P中Camera HAL3的打开流程,从应用程序通过CameraManager打开相机设备,到CameraDevice的创建,再到CameraService与应用端CameraDeviceClient的交互,最后深入到HAL层的逻辑。通过这个过程,读者可以了解到Android系统如何跨进程建立相机服务的通信,以及驱动交互的关键步骤。
摘要由CSDN通过智能技术生成

Camera2中打开相机也需要通过CameraManager类
    private void openCamera() {
        CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        //打开相机设备
        manager.openCamera(mCameraId, mStateCallback, mCameraHandler);
    }
实现StateCallback 接口,当相机打开后会回调onOpened方法,在这个方法里面开启预览
    private CameraDevice mCameraDevice;
    private CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
        @Override
        public void onOpened(CameraDevice camera) {
            //保存相机设备
            mCameraDevice = camera;
            startPreview();
        }

        @Override
        public void onDisconnected(CameraDevice camera) {
            camera.close();
            mCameraDevice = null;
        }

        @Override
        public void onError(CameraDevice camera, int error) {
            camera.close();
            mCameraDevice = null;
        }
    };

Open阶段

frameworks/base/core/java/android/hardware/camera2/CameraManager.java
    public void openCamera(@NonNull String cameraId,
            @NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler) {
        openCameraForUid(cameraId, callback, CameraDeviceImpl.checkAndWrapHandler(handler),
                USE_CALLING_UID);
    }
    public void openCameraForUid(@NonNull String cameraId,
            @NonNull final CameraDevice.StateCallback callback, @NonNull Executor executor,
            int clientUid) {
        openCameraDeviceUserAsync(cameraId, callback, executor, clientUid);
    }
frameworks/base/core/java/android/hardware/camera2/CameraManager.java
    private CameraDevice openCameraDeviceUserAsync(String cameraId,
            CameraDevice.StateCallback callback, Executor executor, final int uid) {
           ICameraDeviceUser cameraUser = null;
            //返回给应用端的相机对象
            android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =
                    new android.hardware.camera2.impl.CameraDeviceImpl(
                        cameraId,
                        callback,
                        executor,
                        characteristics,
                        mContext.getApplicationInfo().targetSdkVersion);

            //应用端的回调函数
            ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks();
            try {
                if (supportsCamera2ApiLocked(cameraId)) {
                    // Use cameraservice's cameradeviceclient implementation for HAL3.2+ devices
                    ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
                    //通过cameraService跨进程获得BpCameraDeviceUser对象
                    cameraUser = cameraService.connectDevice(callbacks, cameraId,
                            mContext.getOpPackageName(), uid);
                }
            }
            //保存CameraDeviceClient对象到CameraDeviceImpl,触发应用的回调函数
            deviceImpl.setRemoteDevice(cameraUser);
     }
-----------------------------------------------------------------------------------------------------------------------------------
CameraDeviceImpl继承CameraDevice
public class CameraDeviceImpl extends CameraDevice
    public CameraDeviceImpl(String cameraId, StateCallback callback, Executor executor,
                        CameraCharacteristics characteristics, int appTargetSdkVersion) {
        mCameraId = cameraId;
        mDeviceCallback = callback;
        mDeviceExecutor = executor;
    }
}

-----------------------------------------------------------------------------------------------------------------------------------
setRemoteDevice的实现
frameworks/base/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
private ICameraDeviceUserWrapper mRemoteDevice;
    public void setRemoteDevice(ICameraDeviceUser remoteDevice) throws CameraAccessException {
        synchronized(mInterfaceLock) {
            mRemoteDevice = new ICameraDeviceUserWrapper(remoteDevice);
            mDeviceExecutor.execute(mCallOnOpened);
            mDeviceExecutor.execute(mCallOnUnconfigured);
        }
    }
    private final Runnable mCallOnOpened = new Runnable() {
        public void run() {
            sessionCallback = mSessionStateCallback;
            sessionCallback.onOpened(CameraDeviceImpl.this);
            //通知相机应用设备已打开,并且返回CameraDeviceImpl对象,相机应用已实现该函数
            mDeviceCallback.onOpened(CameraDeviceImpl.this);
        }
    };
frameworks/base/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java
    public ICameraDeviceUserWrapper(ICameraDeviceUser remoteDevice) {
        mRemoteDevice = remoteDevice;
    }
通过以上流程,相机应用获得了CameraDevice对象,而CameraDevice保存ICameraDeviceUserWrapper对象,ICameraDeviceUserWrapper保存BpCameraDeviceUser对象,BpCameraDeviceUser具有跨进程的能力,这样应用就可以和CameraService端的CameraDeviceClient进行通信了。
-----------------------------------------------------------------------------------------------------------------------------------
CameraManagerGlobal.get().getCameraService()的实现
通过ServiceManager获的cameraService,CameraManager通过CameraManagerGlobal访问CameraService服务,并注册监听,CamreaService持有CameraServiceListener列表,并回调结果给CameraManager。
frameworks/base/core/java/android/hardware/camera2/CameraManager.java
private static final class CameraManagerGlobal extends ICameraServiceListener.Stub {
         public ICameraService getCameraService() {
           //连接服务
            connectCameraServiceLocked();
            return mCameraService;
        }
}
private void connectCameraServiceLocked() {
        //查询服务引用,CAMERA_SERVICE_BINDER_NAME="media.camera"
        IBinder cameraServiceBinder = ServiceManager.getService(CAMERA_SERVICE_BINDER_NAME);
        //转换服务接口
        ICameraService cameraService = ICameraService.Stub.asInterface(cameraServiceBinder);
        //注册回调监听,camerService可以通知CameraManagerGlobal状态变化
        CameraStatus[] cameraStatuses = cameraService.addListener(this);
        //存副本
        mCameraService = cameraService;
}
frameworks/av/services/camera/libcameraservice/CameraService.h
static char const* getServiceName() { return "media.camera"; }

-----------------------------------------------------------------------------------------------------------------------------------
cameraService.connectDevice的实现
跨进程调用CameraManager->CameraService,返回CameraDeviceClient,将应用端的回调函数设置给cameraService。
frameworks/av/services/camera/libcameraservice/CameraService.cpp
Status CameraService::connectDevice(
        const sp<har

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值