前面研究过了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预览相关推荐

  1. Android 源码 Camera2 预览流程分析四

    <Android 源码 Camera2 预览流程分析二>中进行了流启动,这是调用 QCamera3Channel start() 方法实现的,对应于 HAL_PIXEL_FORMAT_YC ...

  2. Android Wear开发者预览版入门

    Android Wear开发者预览版包括工具和API,增强了应用程序通知功能,提供针对Android可穿戴设备的最佳用户体验. 利用Android Wear开发者预览,你可以: 在Android模拟器 ...

  3. android应用窗口模式,[技巧]如何启用Android N开发者预览版中的“自由窗口”模式...

    这里是Android N开发者预览版"自有窗口"模式的一些实际演示截图. 对于已经参加了"Beta Program"的人们来说,通过OTA获取Android N ...

  4. Android P 开发者预览版

    Android P 开发者预览版首发! 在上周的世界移动通信大会 (Mobile World Congress) 上,我们看到由开发者.设备厂商以及芯片合作伙伴组成的 Android 生态系统不断为全 ...

  5. android p preview_细数 Android P 开发者预览版中最不能错过的新特性

    原标题:细数 Android P 开发者预览版中最不能错过的新特性 2018年安卓巴士全球开发者论坛-重庆站 [线下活动]春天到了 跟小编一起去重庆嗨皮吧~ Android P 应用适配新特性1.Pr ...

  6. 罗永浩宣布进军电商直播;微博回应用户数据泄露;Android 11 开发者预览版 2 发布 | 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自视觉中国 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦, ...

  7. 神经网络API、Kotlin支持,那些你必须了解的Android 8.1预览版和Android Studio 3.0新特性

    曾仅用 55 秒发布会的 Android 8.0 Oreo 在时隔两个月后,Google 于今天在其官方网站上正式发布了 Android 8.1 首个开发者预览版,此次升级涵盖了针对多个功能的提升优化 ...

  8. Android N开发者预览版(第二版)发布

    上个月,我们发布了首个Android N的开发者预览版,本文将带你先睹为快,一窥新发布的Android N开发者预览版第二版.大家的反馈帮助我们找出了很多bug,再对功能做出改进并修复一些bug后,我 ...

  9. Android Wear 开发者预览版安装

    今天google发布了Android Wear 平台,借助该平台,开发者可以将Android移植到可穿戴设备上.Android Wear的SDK还没有发布,想尝鲜的开发者可以试用 [Android W ...

最新文章

  1. php程序应用实例,PHP教程.应用实例1_php
  2. eeglab中文教程系列(13)-导入cnt文件
  3. Apache+tomcat+mysql安装步骤
  4. matlab点云配准(总结性)
  5. [转载] Python新手写出漂亮的爬虫代码1——从html获取信息
  6. python做接口测试的优点_python做接口测试的必要性
  7. C++总结学习(一)
  8. php怎么把时间精确到毫秒,如何使用php获取当前时间戳、日期并精确到毫秒
  9. U盘容量变小后修复的方法
  10. 转:性、恐惧、爱、信念,管理者一生都逃不掉的课题
  11. Python|Leetcode《306》|累加数
  12. 音乐播放器制作 (HTML + CSS + JavaScript)
  13. 红皮书 Object
  14. 汉字如何应用在平面设计中
  15. 为什么行程码不能显示到县级,工信部回应
  16. css怎么设置页面缩放最小宽度
  17. 五层协议网络体系结构的要点及主要任务
  18. Ajax简单实现注册用户名校验
  19. 设计初学者必学之AI图形描边:宽度工具与画笔工具
  20. 在线客服php技术,WeLive开源PHP在线客服系统、在线客服源码下载

热门文章

  1. 修改Linux系统分区后挂载问题
  2. Java中split函数的用法及使用示例
  3. 2018 年React 将独占前端框架鳌头
  4. AngularJS资源整理收集
  5. javascript 求解图表曲线波峰与波谷,类似股票曲线
  6. 推荐30款最佳的数据可视化工具
  7. 计算机中什么是以二进制表示的信息,计算机计算各种信息-为什么计算机中的所有信息都以二进制方式表示 – 手机爱问...
  8. dd linux 尾部添加0_dd使用方法详解
  9. Javascript第六章世上最全常用RegExp正则表达式及表单验证源码第七课
  10. python类型转换方法_整理了最全的Python3数据类型转换方法,可以收藏当手册用...