android camera: android.hardware.camera2向下和camera service

2024-06-03 15:18

本文主要是介绍android camera: android.hardware.camera2向下和camera service,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

android.hardware.camera2向下和camera service的通信是通过mCameraService和mRemoteDevice

frameworks/base/core/java/android/hardware/camera2/
/**
* A per-process global camera manager instance, to retain a connection to the camera service,
* and to distribute camera availability notices to API-registered callbacks
*/
private static final class CameraManagerGlobal extends ICameraServiceListener.Stub
        /**
         * Connect to the camera service if it's available, and set up listeners.
         */
private static final String CAMERA_SERVICE_BINDER_NAME = "media.camera";
        private void connectCameraServiceLocked() {
            IBinder cameraServiceBinder = ServiceManager.getService(CAMERA_SERVICE_BINDER_NAME);

            ICameraService cameraService = ICameraService.Stub.asInterface(cameraServiceBinder);

            CameraMetadataNative.setupGlobalVendorTagDescriptor();


            try {
                CameraStatus[] cameraStatuses = cameraService.addListener(this);
                for (CameraStatus c : cameraStatuses) {
                    onStatusChangedLocked(c.status, c.cameraId);
                }
                mCameraService = cameraService;
            }
        }
}
通过JNI调用setupGlobalVendorTagDescriptor,natice层也是调用CameraService做具体的实现。


CameraManager通过CameraMangerGlobal工作:
public void openCamera(@NonNull String cameraId,
            @NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler) ->
public void openCameraForUid(@NonNull String cameraId,
    @NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler,
    int clientUid) ->
private CameraDevice openCameraDeviceUserAsync(String cameraId,
    CameraDevice.StateCallback callback, Handler handler, final int uid){
        CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
        CameraDevice device = null;


   ICameraDeviceUser cameraUser = null;
   android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =
   new android.hardware.camera2.impl.CameraDeviceImpl(
       cameraId,
       callback,
       handler,
       characteristics,
       mContext.getApplicationInfo().targetSdkVersion);
            ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks();
   // Use cameraservice's cameradeviceclient implementation for HAL3.2+ devices
            ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
            cameraUser = cameraService.connectDevice(callbacks, cameraId,
                    mContext.getOpPackageName(), uid);
            deviceImpl.setRemoteDevice(cameraUser);
            device = deviceImpl;
        return device;
}

CameraDevice, CameraDeviceImpl, ICameraDeviceUser三者之间的关系:
public class CameraDeviceImpl extends CameraDevice
public void setRemoteDevice(ICameraDeviceUser remoteDevice) throws CameraAccessException {
    mRemoteDevice = new ICameraDeviceUserWrapper(remoteDevice);
    mDeviceHandler.post(mCallOnOpened);
    mDeviceHandler.post(mCallOnUnconfigured);
}


1. 通过ICameraService接口访问ICameraService.aidl

ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
ICameraDeviceUser cameraUser=
cameraService . connectDevice ( callbacks , cameraId , mContext . getOpPackageName (), uid );

 
mRemoteDevice = new ICameraDeviceUserWrapper(cameraUser);


2. 通过ICameraDeviceUserWrapper mRemoteDevice访问ICameraDeviceUser.aidl

这里Wrapper的意思只是多了异常捕捉而已

    public void prepare(int streamId) throws CameraAccessException {try {mRemoteDevice.prepare(streamId);} catch (Throwable t) {CameraManager.throwAsPublicException(t);throw new UnsupportedOperationException("Unexpected exception", t);}}

这篇关于android camera: android.hardware.camera2向下和camera service的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1027355

相关文章

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO