【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

相关文章

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3