android系统 两个app共享摄像头的做法

两个app共享摄像头的实现分析

有两种做法,一个是通过虚拟出一个共享摄像头的做法,本质上是硬件驱动层新增对某个物理摄像头的映射,需要修改驱动,增加cameraid,另外需要在摄像头的打开,streamOn和streamOff都要要做相应的修改,需要对camera的代码结构有很深的理解。这里为了简单,易行,我这里使用另一种做法,使用Binder去实现。

分析camera可以实现的方式:其中有surface是继承Parcelable的,可以通过binder方式去传递

binder的aidl的接口需要将surface传递到对应的app

如void addSurface(in Surface surface);

服务端程序需要将binder传递过来的surface加入到CameraCaptureSession中来,也就是重新预览,以下我们定义为mSurface

		closeCaptureSession();
        mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        // 添加输出到屏幕的surface
        // builder.addTarget(mPreviewSurface);
        if(mSurface!=null) {
            mPreviewBuilder.addTarget(mSurface);
        }
        mPreviewBuilder.addTarget(mImageReader.getSurface());
        List<Surface> list = mSurface==null? Arrays.asList(mImageReader.getSurface()):Arrays.asList(mImageReader.getSurface(),mSurface);
        mCameraDevice.createCaptureSession(list,
                new CameraCaptureSession.StateCallback() {

                    @Override
                    public void onConfigured(@NonNull CameraCaptureSession session) {
                        Log.i(TAG, "onConfigured: mCaptureSession0 ");
                        mCaptureSession = session;
                        CaptureRequest captureRequest = mPreviewBuilder.build();
                        try {
                            // 一直发送预览请求
                            mCaptureSession.setRepeatingRequest(captureRequest, null, mBackgroundHandler);
                        } catch (CameraAccessException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onConfigureFailed(@NonNull CameraCaptureSession session) {
                        Log.e(TAG, "ConfigureFailed. session: mCaptureSession");
                    }
                }, mBackgroundHandler); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值