【Android Camera1】Camera1初始化销毁流程(三) —— 权限请求和相机功能大管家CameraManager

本文主要是介绍【Android Camera1】Camera1初始化销毁流程(三) —— 权限请求和相机功能大管家CameraManager,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

权限请求和相机功能大管家CameraManager

  • 一、权限请求
  • 二、线程管理
    • 2.1 单例
    • 2.2 Handler
    • 2.3 常用功能

本篇文章简单介绍初始化相关的权限请求和线程管理

一、权限请求

相机应用肯定需要相机权限,如果没有相机权限就初始化相机,基本会报如下类似错误:can't not connect camera service,因此在初始化相机之前一定要确保相机权限申请通过。我们可以在surfaceChange里添加如下代码:

 @Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {super.surfaceChanged(holder, format, w, h);tryInit();}public void tryInit(){if(ActivityCompat.checkSelfPermission(AppContexts.sContext, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {uiObserver.onPermissionDeny()return false;}uiObserver.onPermissionGranted()}

uiObserver是用来触发界面修改的。没有权限要在界面上提示用户,不然用户进来就发现黑屏就会觉得应用体验不好。容易遗失用户。

二、线程管理

CameraManager:即进行统一调度管理相机具体实现的抽象层。对上层暴露公共接口、对下层统一管理不同API的实现。一个基本健全的CameraManager应该包含如下功能:

2.1 单例

作为相机的抽象管理类,应该设计为单例

    private static final class SingleHolder {private static final CameraManager INSTANCE = new CameraManager();}public static CameraHelper of() {return SingleHolder.INSTANCE;}

2.2 Handler

//CameraManager.java
1. handle 作为消息分发
2. Android里可自行参考相关资料实现自己的Handler或者继承HandlerThread3.Handler处理业务层调用并分发消息给Camera实现类。
**********************************
public CameraHandler handler

2.3 常用功能

变量
*******************************************
private AbsBaseCameraImpl mCameraImpl;
public CameraHandler handler分发消息
1.初始化
2.对焦
3.缩放
4.曝光
5.闪光灯
6.拍照
7.stop
8.release
9.切换前后置
10.AWB:白平衡调节
********************************************
public static final int MSG_INIT_CAMERA = 0;
public static final int MSG_SWITCH_FOCUS = 2;
public static final int MSG_ZOOM_CHANGE = 3;
public static final int MSG_EXPOSURE_CHANGE = 4;
public static final int MSG_SWITCH_FLASH = 5;
public static final int MSG_TAKE_PIC = 6;
public static final int MSG_STOP_CAMERA = 7;
public static final int MSG_RELEASE_CAMERA = 8;
public static final int MSG_SWITCH_CAMERA = 9;
public static final int MSG_AWB_CHANGE = 10;对应函数
********************************************
public void initCamera(int cameraId, float aspectRatio){
getCameraHandler().sendMessage(handler.obtainMessage(MSG_INIT_CAMERA, cameraId, aspectRatio));
}public void switchFocus(int focusMode){...}
public void switchZoom(float zoomValue){...}
public void switchExposure(float exposureValue){...}
public void switchFlash(int flashMode){...}
public void takePic(TakePicCallBack callBack){...}
public void stopCamera(){...}
public void releaseCamera(){...}
public void switchCamera(){...}消息分发
********************************************
public void handleMessage(Message msg){switch (msg.what) {case MSG_INIT_CAMERA:camera.initCamera((int)msg.obj[0],(float)msg.obj[1]);break;...}
}
上层回调
1. previewSize selected
2. pictureSize selected
3. previewStarted
********************************************
public interface CameraStatusCallback {void onPreviewSizeChange(int width, int height);void onPictureSizeChange(int width, int height);void onPreviewStarted();
}

本篇文章简要介绍了权限检查和申请,以及CameraManager.java类的设计。

下一篇文章具体阐述Camera1Impl.java的实现。

如有疑问或勘误请评论或者通过如下邮箱联系我
sunquan9301@163.com

这篇关于【Android Camera1】Camera1初始化销毁流程(三) —— 权限请求和相机功能大管家CameraManager的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

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

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

MobaXterm远程登录工具功能与应用小结

《MobaXterm远程登录工具功能与应用小结》MobaXterm是一款功能强大的远程终端软件,主要支持SSH登录,拥有多种远程协议,实现跨平台访问,它包括多会话管理、本地命令行执行、图形化界面集成和... 目录1. 远程终端软件概述1.1 远程终端软件的定义与用途1.2 远程终端软件的关键特性2. 支持的

Java中实现订单超时自动取消功能(最新推荐)

《Java中实现订单超时自动取消功能(最新推荐)》本文介绍了Java中实现订单超时自动取消功能的几种方法,包括定时任务、JDK延迟队列、Redis过期监听、Redisson分布式延迟队列、Rocket... 目录1、定时任务2、JDK延迟队列 DelayQueue(1)定义实现Delayed接口的实体类 (