Camera2 openCamera

Camera2 openCamera 流程分析 文章目录一、相机架构二、应用框架1.Camera APP2.AIDL3.原生框架4.binder IPC 接口5.相机服务6.HAL三、流程分析1.openCamera 一、相机架构 (详细资料参见:https://source.android.google.cn/devices/camera) 二、应用框架 1.Camera APP 应用代码位于应用框架级别,它使用 Camera 2 API 与相机硬件进行互动。在内部,此代码会调用相应的 Binder 接口,以访问与相机互动的原生代码。 2.AIDL 阅读详情

Camera2 中,CameraManager.java管理所有camera设备,

获取cameraManager:

mCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);

打开camera:

mCameraManager.openCamera(mCameraId, DeviceStateCallback, mHandler);

打开camera过程:

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

        if (cameraId == null) {
            throw new IllegalArgumentException("cameraId was null");
        } else if (callback == null) {
            throw new IllegalArgumentException("callback was null");
        } else if (handler == null) {
            if (Looper.myLooper() != null) {
                handler = new Handler();
            } else {
                throw new IllegalArgumentException(
                        "Handler argument is null, but no looper exists in the calling thread");
            }
        }

        openCameraDeviceUserAsync(cameraId, callback, handler);

openCameraDeviceUserAsync:

   private CameraDevice openCameraDeviceUserAsync(String cameraId,
            CameraDevice.StateCallback callback, Handler handler)
            throws CameraAccessException {
        CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
        CameraDevice device = null;
        try {

            synchronized (mLock) {

                ICameraDeviceUser cameraUser = null;

                android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =
                        new android.hardware.camera2.impl.CameraDeviceImpl(
                                cameraId,
                                callback,
                                handler,
                                characteristics);

                BinderHolder holder = new BinderHolder();

                ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks();
                int id = Integer.parseInt(cameraId);
                try {
                    if (supportsCamera2ApiLocked(cameraId)) {    //到CameraService.cpp中查询是否支持API2 ,需要HAL支持ModuleApiVersion >= CAMERA_MODULE_API_VERSION_2_0
                        // Use cameraservice's cameradeviceclient implementation for HAL3.2+ devices
                        ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
                        if (cameraService == null) {
                            throw new CameraRuntimeException(
                                CameraAccessException.CAMERA_DISCONNECTED,
                                "Camera service is currently unavailable");
                        }
                        cameraService.connectDevice(callbacks, id,
                                mContext.getOpPackageName(), USE_CALLING_UID, holder);
                        cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder());//API2.0,获取native层Client
                    } else {  //CameraDeviceUserShim 兼容API1.0, 在java层使用camera.java通过JNI与native层通信。

                        // Use legacy camera implementation for HAL1 devices
                        Log.i(TAG, "Using legacy camera HAL.");
                        cameraUser = CameraDeviceUserShim.connectBinderShim(callbacks, id); 
                    }
                } catch (CameraRuntimeException e) {
                    if (e.getReason() == CameraAccessException.CAMERA_DEPRECATED_HAL) {
                        throw new AssertionError("Should've gone down the shim path");
                    } else if (e.getReason() == CameraAccessException.CAMERA_IN_USE ||
                            e.getReason() == CameraAccessException.MAX_CAMERAS_IN_USE ||
                            e.getReason() == CameraAccessException.CAMERA_DISABLED ||
                            e.getReason() == CameraAccessException.CAMERA_DISCONNECTED ||
                            e.getReason() == CameraAccessException.CAMERA_ERROR) {
                        // Received one of the known connection errors
                        // The remote camera device cannot be connected to, so
                        // set the local camera to the startup error state
                        deviceImpl.setRemoteFailure(e);

                        if (e.getReason() == CameraAccessException.CAMERA_DISABLED ||
                                e.getReason() == CameraAccessException.CAMERA_DISCONNECTED ||
                                e.getReason() == CameraAccessException.CAMERA_IN_USE) {
                            // Per API docs, these failures call onError and throw
                            throw e.asChecked();
                        }
                    } else {
                        // Unexpected failure - rethrow
                        throw e;
                    }
                } catch (RemoteException e) {
                    // Camera service died - act as if it's a CAMERA_DISCONNECTED case
                    CameraRuntimeException ce = new CameraRuntimeException(
                        CameraAccessException.CAMERA_DISCONNECTED,
                        "Camera service is currently unavailable", e);
                    deviceImpl.setRemoteFailure(ce);
                    throw ce.asChecked();
                }

                // TODO: factor out callback to be non-nested, then move setter to constructor
                // For now, calling setRemoteDevice will fire initial
                // onOpened/onUnconfigured callbacks.
                deviceImpl.setRemoteDevice(cameraUser);
                device = deviceImpl;
            }

        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("Expected cameraId to be numeric, but it was: "
                    + cameraId);
        } catch (CameraRuntimeException e) {
            throw e.asChecked();
        }
        return device;
    }

API1.0通过camera.java---->JNI----->cameraclient。

API2.0通过java层获取到底层CameraClient,使用binder与service通信。


Android Camera2 openCamera流程详解(1) 本文用Android 11 的代码进行梳理。 Android Camera2 open Camera的接口为CameraManager的openCamera函数,如下: frameworks/base/core/java/android/hardware/camera2/CameraManager.java 648 @RequiresPermission(android.Manifest.permission.CAMERA) 649 public void openCamera(@Non 阅读详情

相关推荐

Camera2 openCamera源码分析

在CameraService中makeClient流程中,主要根据设备版本号和camera api的版本号来创建camera相关的设备。在CameraDeviceImpl的setRemoteDevice流程中,主要完成的是将底层binder对象封装成ICameraDeviceUserWrapper并注册死亡通知,然后通过执行器在线程中完成camera设备打开的状态回调,最终camera应用获取到打开的camera对象,后续可以通过这个camera对象来完成camera命令的调用。

xx18030637774的博客 1059

Android Camera API和HAL版本对应关系

前言 Android在版本更新和迭代过程中, Camera相关代码也经历了几个版本的更新, 主要表现为Camera HAL版本更新(HAL1 -> HAL2 -> HAL3), Camera API版本更新(Camera API1 -> Camera API2), 由于Android版本是向后兼容的, 所以为了解决兼容问题, 势必要做一些特殊的处理来保证不同版本调用问题, 本文主要说明 Camera HAL1, Camera HAL3, API1, API2之间的调用关系, 由于Came

转载和创作优秀的博客 1089

数据结构实验1.2—高精度计算PI值(西工大)

这是数据结构第二题的题目,是让我们根据用户的需求来计算派的值 这是题目的详细描述,刚看到这道题的时候,我是真的头大,完全没有思路,于是查找了一些大佬的笔记后才开始编写 这是我在写这些代码是所运用到的数学反三角函数幂次展开式的知识。 下面是正确的代码以及我的一些见解,和需要注意的一些地方。希望能对你有所帮助。如有更加精简的算法,请在评论区留下你的算法!!!谢谢!!! #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdl

abcdef0623的博客 5831

java.lang.IllegalArgumentException 异常报错完美解决

目录 修改JDK使用版本 修改开发工具idea配置(eclipse的直接跳过这个看下面) 修改开发工具eclipse配置 学习spring依赖注入的时候碰到这个坑,折腾了许久,记录一下以防其他小伙伴入坑! 该异常主要原因是因为JDK与Spring版本不一致。要么更换jdk,要么重新下载符合jdk的springjar包 我本地装了两个JDK版本,一个1.8,一个1.7,原本以为只要修改一...

辰小白 16万+

从零搭建openEuler ARM64开发测试环境:手把手教你用libvirt+KVM配置虚拟机(含VNC远程安装)

本文详细介绍了如何在ARM64平台上从零搭建openEuler开发测试环境,涵盖libvirt和KVM配置虚拟机的完整流程,包括环境准备、存储配置、网络优化、XML配置详解以及VNC远程安装。特别针对华为欧拉(openEuler)系统进行了优化,帮助开发者快速构建高效的ARM架构虚拟化环境。

weixin_30545945的博客 587

基于555定时器的D类功放设计:从PWM原理到无反馈电路实践

D类功放(数字功放)是一种高效率的音频放大技术,其核心原理是脉冲宽度调制(PWM)。它将输入的模拟音频信号转换为一系列高速开关的脉冲,通过控制功率开关管(如MOSFET)的通断,再经低通滤波器还原放大后的音频。相比传统AB类功放,其转换效率通常超过90%,显著降低了热能损耗。这项技术在追求高能效和小型化的现代音频设备中价值凸显,广泛应用于有源音箱、汽车音响和便携式设备。本文聚焦于一种独特的实现方案:以经典的555定时器芯片为核心,构建一个无整体负反馈的D类功放。通过剖析其PWM调制器、FET电压-电流转换级

weixin_30162121的博客 222

唤醒后相机退出并提示open camera error id =0

错误log如下 05-13 09:22:38.192 W/System.err( 4471): android.hardware.camera2.CameraAccessException: CAMERA_DISABLED (1): connectHelper:1735: Camera "0" disabled by policy 05-13 09:22:38.192 W/System.err( 4471): at android.hardware.camera2.CameraManager.throwA

wangjicong_215的博客 2415

避坑指南:STM32CubeMX安装后,你的第一个工程为什么中文全是乱码?

本文详细解析了STM32CubeMX安装后中文乱码问题的根源及解决方案。从诊断乱码现象到分析编码冲突背景,提供了新项目UTF-8化、旧项目GBK兼容及版本降级等多种实用方案,帮助开发者彻底解决这一常见问题。

weixin_30699955的博客 474

Camera2 OpenCamera流程

和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:1.1、APP层传递摄像头id来打开摄像头这里的callback是回调给APP的摄像头打开的结果handler这里主要是设置上面的回调所在的线程。该参数可以为空,为空framework会内部创建一个当前线程的Handler。openCamera(@NonNull String cameraId, @NonN...

程序员Android 1546

【CATIA的二次开发38】对象Selection交互选择部分方法介绍01

在CATIA V5的VBA开发中,Selection对象是用户交互的核心组件,用于管理用户在图形区域或特征树中的选择操作。Selection 对象是 CATIA VBA 中的中央交互枢纽,充当用户界面与程序逻辑之间的桥梁。它代表当前在图形区域或特征树中被选中的元素集合,是自动化操作的基础。

学习共勉:不积跬步,无以至千里; 不积小流,无以成江海。 1342

光伏5G多合一融合终端|光伏多合一融合终端|光伏多合一群调群控网关|分布式光伏群控群调|光伏AGC/AVC系统这几者之间什么技术关系,多少钱一套预算?

RCL-0923光伏电站电压\功率自动控制装置(光伏AVC/AGC),能够接收调度DMS下发的调节目标(电压或无功),按既定策略的调节目标计算光伏电站无功功率出力需求,支持总有、无功,最大可调范围、逆变器个数等数据的上送,通过选择控制设备并进行无功功率出力分配,并将最终控制指令自动下达给被控制设备,最终实现光伏电站无功功率控制,实现无功功率、并网点电压的监测和控制,跟踪调度中心下发的电压或无功调节目标值,实现分布式电源的可观可测,可调可控。光伏5G多合一融合终端的功能:群调群控/AGC/AVC功能。

分布式DTU物联网DTU 2607

2 [Android P]OpenCamera详细分析(Camera2+Hal3)

Android Camera2 + HAL3架构分析 本文基于Android P系统,详细分析了OpenCamera的流程,从应用层、Framework层到HAL层。主要包含以下内容: 整体架构 采用Camera2+Hal3架构,包含两个接口(AIDL和HIDL)和三个层次(App层、Framework层、HAL层) App与CameraService通过AIDL通信,CameraService与CameraProvider通过HIDL通信 进程启动流程 CameraProvider进程:系统启动时初始化,

u012906122的专栏 1万+

初级文章【西门子】字符拼接成字符串

针对S7-400极其以下PLC,1200往上据说有专门的块了呢,首先,我是不用库的,需要什么函数会自己写,OK进入正题。 首先,我们有一个DB块,里面有14个char,一个14位的char数组和一个14位的string。如下图。 我们的目的是将char1-char10拼接成一个string。 第一种方式:第一步,将char放进数组。 ​​​​​​​ 相信大家都能看明白,但是我还是要解释解释 L取值2 T赋值到临时变量DBNO(INT) OPN DB [#DBNO]获取DB块,这一句.

NS_Speak(IVAV) 1万+

android sse 人脸识别,基于Android Camera2之openCamera 流程

简介frameworks\base\core\java\android\hardware\camera2Camera2在Android 5.0上首次出现,主要重新定义了一套Camera 的使用接口API,设计思想出现了变化,具体的可自行搜索,此处主要介绍下Camera2的常见类以及使用流程。CameraCaptureSession 类 会话类,即用户发起操作Camera设备的动作类,如录像拍照等C...

weixin_39931362的博客 697

量化之趋势跟踪策略

趋势跟踪策略 import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt import seaborn as sns from finance import GetData import warnings; warnings.filterwarnings('ignore') data = GetData.get_data('../data/002236.csv') .

木头大左的博客 2533

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Camera API2 基础流程_openCamera(frameworks)

Camera API2 openCamera流程

qq_37695230的博客 1422

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android Multimedia框架总结(十六)Camera2框架之openCamera及session过程

前言:前一篇介绍了Camera2相关类作用及功能,并未对源码部分了解,今天了解了在Camera2框架中openCamera及session过程,Agenda如下:

欢迎关注公众号:【码农突围】,公号后台回复9999,可以获取一份500页的LeetCode刷题笔记。 5929

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

camera 之 openCamera

openCameraopenCamera() 方法参数解析openCamera() 代码跟踪 openCamera() 方法参数解析 1、 打开 camera我们可以直接调用系统service,获得CameraManager,然后调用openCamera(); CameraManager cameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE); cameraManager.openCamera(mC

android 5391

Android 源码 Camera2 openCamera 流程分析

打开相机的起点从 CameraManager 类 openCamera(…) 方法开始。 打开具有给定 ID 的相机连接。 使用 getCameraIdList 获取可用相机设备的列表。请注意,即使列出了 ID,但如果在对 getCameraIdList 和 openCamera 的调用之间断开了设备的连接,或者如果优先级更高的相机 API 客户端开始使用相机设备,则打开可能会失败。 从 API 级别 23 开始,由于优先级较低的后台相机 API 客户端正在使用该设备,因此已调用 Availability

洪伟的专栏 2850

Android P Camera2相机简单解析(一、openCamera)

Framework CameraManager 文件路径:/frameworks/base/core/java/android/hardware/camera2/CameraManager.java 上层调用的API有两个,分别如下: @RequiresPermission(android.Manifest.permission.CAMERA) public void openCamera(@N...

qq_16569715的博客 1950

Android camera: openCamera[1]

APP通过函数cameraAPI2 openCamera打开camerapublic void openCamera(@NonNull String cameraId,            @NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler)APP传入的callback:CameraDevic...

u011279649的专栏 1195

android camera 工作原理,Android Camera原理之openCamera模块(一)

我们平时开发,知道怎么调度api,怎么调起camera,怎么调用camera的实例来操作camera就可以了,但是这些调度的背后都做了什么事情,我们可能不太清楚,本文打算从openCamera这个调用谈起,展开说下camera调起之后底层是怎么工作的?Camera操作过程中最重要的四个步骤:CameraManager-->openCamera ---> 打开相机CameraDevi...

weixin_30446557的博客 769

Android Camera2 HAL3 高通Qualcomm Camera底层openCamera代码流程

本文列出代码调用流程,作为参考,要想了解高通驱动架构需要结核实际理解代码,不要一味的沉浸在代码中,这样是没有任何效果的。 openCamera /*openCamera_flow*/ #if 1 /*************************openCamera_flow_start************************************************...

SSSS的博客 1838
上一篇: Camera Service Binder框架
shenglinuxer
博客等级 码龄23年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值