android之camera2预览
前面研究过了camera1,但是新的android sdk支持camera2,所以必须也要掌握camera2.
先参考资料:
https://blog.csdn.net/afei__/article/details/92102775
https://blog.csdn.net/tong5956/article/details/82688886
https://www.cnblogs.com/lonelyxmas/p/9175768.html
https://blog.csdn.net/afei__/article/details/86326991
几个概念:
SurfaceView:图像显示的地方
SurfaceHolder:连接图像显示地方与外部的通道,相当于接口
CameraManager:摄像机的管理类
CameraDevice:具体相机的操作类
调用流程:
1、获取摄像机管理类:mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
2、打开某个具体的摄像机:mCameraManager.openCamera(cameraId, stateCallback, null);
3、在打开成功的回调里面,创建预览请求:mCameraDevice.createCaptureSession
4、在创建预览请求的回调里面,设置预览模式:mCameraCaptureSession.setRepeatingRequest
大概分为以上4个步骤
实现代码如下:
package com.example.grammartest;import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;import java.io.IOException;
import java.util.Arrays;
import android.widget.Toast;public class Camera2Activity extends AppCompatActivity {String tag = "Camera2Activity";private static final String[] REQUIRED_PERMISSIONS = {Manifest.permission.CAMERA};private static final int REQUEST_PERMISSIONS_CODE = 1;private CameraManager mCameraManager;//摄像头管理器CameraDevice mCameraDevice;String FRONTId, BACKId;private SurfaceHolder mSurfaceHolder;private CameraCaptureSession mCameraCaptureSession;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_camera2);InitView();InitCameraInfo();}void InitView() {Button ViewBt = findViewById(R.id.Camera2PlayBt);Button ViewCloseBt = findViewById(R.id.Camera2CloseBt);SurfaceView surfaceView = findViewById(R.id.Camera2surfaceViewId);mSurfaceHolder = surfaceView.getHolder();ViewBt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.i(tag,"setOnClickListener");OpenCamera(BACKId);}});ViewCloseBt.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v) {CloseCamera();}});}void InitCameraInfo() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);String[] cameraList = new String[0];try {cameraList = mCameraManager.getCameraIdList();} catch (CameraAccessException e) {e.printStackTrace();}for (String item : cameraList) {Log.i(tag, "Camera2Activity:" + item);String FrontItem = CameraCharacteristics.LENS_FACING_FRONT + "";String BackItem = CameraCharacteristics.LENS_FACING_BACK + "";if (item.equals(FrontItem)) {FRONTId = item;} else if (item.equals(BackItem)) {BACKId = item;}}}}void OpenCamera(String cameraId) {if (false == isRequiredPermissionsGranted()) {Log.i(tag, "isRequiredPermissionsGranted false");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {requestPermissions(REQUIRED_PERMISSIONS, REQUEST_PERMISSIONS_CODE);}return;}try {if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {return;}mCameraManager.openCamera(cameraId, stateCallback, null);} catch (CameraAccessException e) {e.printStackTrace();}}void CloseCamera(){if (null != mCameraDevice){mCameraDevice.close();mCameraDevice = null;}}private void takePreview() {try {// 创建CameraCaptureSession,该对象负责管理处理预览请求和拍照请求mCameraDevice.createCaptureSession(Arrays.asList(mSurfaceHolder.getSurface()), new CameraCaptureSession.StateCallback() // ③{@Overridepublic void onConfigured(CameraCaptureSession cameraCaptureSession) {if (null == mCameraDevice) return;// 当摄像头已经准备好时,开始显示预览mCameraCaptureSession = cameraCaptureSession;try {// 创建预览需要的CaptureRequest.Builderfinal CaptureRequest.Builder previewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);// 将SurfaceView的surface作为CaptureRequest.Builder的目标previewRequestBuilder.addTarget(mSurfaceHolder.getSurface());// 自动对焦previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);// 打开闪光灯previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);// 显示预览CaptureRequest previewRequest = previewRequestBuilder.build();mCameraCaptureSession.setRepeatingRequest(previewRequest, null, null);} catch (CameraAccessException e) {e.printStackTrace();}}@Overridepublic void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {Toast.makeText(Camera2Activity.this, "配置失败", Toast.LENGTH_SHORT).show();}}, null);} catch (CameraAccessException e) {e.printStackTrace();}}private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {@Overridepublic void onOpened(CameraDevice camera) {mCameraDevice = camera;Log.i(tag, "CameraDevice onOpened");takePreview();}@Overridepublic void onDisconnected(@NonNull CameraDevice camera) {Log.i(tag, "CameraDevice Disconnected");}@Overridepublic void onError(@NonNull CameraDevice camera, int error) {Log.e(tag, "CameraDevice Error");}};private boolean isRequiredPermissionsGranted() {for (String permission : REQUIRED_PERMISSIONS) {if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_DENIED) {return false;}}return true;}
}
android之camera2预览相关推荐
- Android 源码 Camera2 预览流程分析四
<Android 源码 Camera2 预览流程分析二>中进行了流启动,这是调用 QCamera3Channel start() 方法实现的,对应于 HAL_PIXEL_FORMAT_YC ...
- Android Wear开发者预览版入门
Android Wear开发者预览版包括工具和API,增强了应用程序通知功能,提供针对Android可穿戴设备的最佳用户体验. 利用Android Wear开发者预览,你可以: 在Android模拟器 ...
- android应用窗口模式,[技巧]如何启用Android N开发者预览版中的“自由窗口”模式...
这里是Android N开发者预览版"自有窗口"模式的一些实际演示截图. 对于已经参加了"Beta Program"的人们来说,通过OTA获取Android N ...
- Android P 开发者预览版
Android P 开发者预览版首发! 在上周的世界移动通信大会 (Mobile World Congress) 上,我们看到由开发者.设备厂商以及芯片合作伙伴组成的 Android 生态系统不断为全 ...
- android p preview_细数 Android P 开发者预览版中最不能错过的新特性
原标题:细数 Android P 开发者预览版中最不能错过的新特性 2018年安卓巴士全球开发者论坛-重庆站 [线下活动]春天到了 跟小编一起去重庆嗨皮吧~ Android P 应用适配新特性1.Pr ...
- 罗永浩宣布进军电商直播;微博回应用户数据泄露;Android 11 开发者预览版 2 发布 | 极客头条...
整理 | 屠敏 头图 | CSDN 下载自视觉中国 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦, ...
- 神经网络API、Kotlin支持,那些你必须了解的Android 8.1预览版和Android Studio 3.0新特性
曾仅用 55 秒发布会的 Android 8.0 Oreo 在时隔两个月后,Google 于今天在其官方网站上正式发布了 Android 8.1 首个开发者预览版,此次升级涵盖了针对多个功能的提升优化 ...
- Android N开发者预览版(第二版)发布
上个月,我们发布了首个Android N的开发者预览版,本文将带你先睹为快,一窥新发布的Android N开发者预览版第二版.大家的反馈帮助我们找出了很多bug,再对功能做出改进并修复一些bug后,我 ...
- Android Wear 开发者预览版安装
今天google发布了Android Wear 平台,借助该平台,开发者可以将Android移植到可穿戴设备上.Android Wear的SDK还没有发布,想尝鲜的开发者可以试用 [Android W ...
最新文章
- php程序应用实例,PHP教程.应用实例1_php
- eeglab中文教程系列(13)-导入cnt文件
- Apache+tomcat+mysql安装步骤
- matlab点云配准(总结性)
- [转载] Python新手写出漂亮的爬虫代码1——从html获取信息
- python做接口测试的优点_python做接口测试的必要性
- C++总结学习(一)
- php怎么把时间精确到毫秒,如何使用php获取当前时间戳、日期并精确到毫秒
- U盘容量变小后修复的方法
- 转:性、恐惧、爱、信念,管理者一生都逃不掉的课题
- Python|Leetcode《306》|累加数
- 音乐播放器制作 (HTML + CSS + JavaScript)
- 红皮书 Object
- 汉字如何应用在平面设计中
- 为什么行程码不能显示到县级,工信部回应
- css怎么设置页面缩放最小宽度
- 五层协议网络体系结构的要点及主要任务
- Ajax简单实现注册用户名校验
- 设计初学者必学之AI图形描边:宽度工具与画笔工具
- 在线客服php技术,WeLive开源PHP在线客服系统、在线客服源码下载
热门文章
- 修改Linux系统分区后挂载问题
- Java中split函数的用法及使用示例
- 2018 年React 将独占前端框架鳌头
- AngularJS资源整理收集
- javascript 求解图表曲线波峰与波谷,类似股票曲线
- 推荐30款最佳的数据可视化工具
- 计算机中什么是以二进制表示的信息,计算机计算各种信息-为什么计算机中的所有信息都以二进制方式表示 – 手机爱问...
- dd linux 尾部添加0_dd使用方法详解
- Javascript第六章世上最全常用RegExp正则表达式及表单验证源码第七课
- python类型转换方法_整理了最全的Python3数据类型转换方法,可以收藏当手册用...