相机预览问题

通过SurfaceView,TextureView,GlSurfaceView显示相机预览

显示相机预览内容是每个相机类应用都会包含的功能,想要完美实现这个却并非易事。原因是,在某些特别极端情况下 camera2 API 的使用会变得很复杂,而且在不同设备上的行为还会有所不同。还好, Jetpack CameraX 库 的 PreviewView 可以帮助您解决这一问题。通过在各种 Android 设备上提供开发者友好、一致且稳定的 API,使得展示相机的预览变得不再困难。

如果要向 Android 应用中添加相机功能,您有以下三个主要选项:

  • CameraX
  • Camera2
  • Camera(已废弃)

CameraX 基于 Camera2 软件包构建而成。如果您需要低级别的相机控件来支持复杂用例,那么 Camera2 是一个不错的选择,但相应 API 比 CameraX 更复杂,并且您需要管理设备专属配置。与 CameraX 一样,Camera2 适用于 Android 5.0(API 级别 21)及更高版本。

CameraX 支持大多数常见的相机用例:

  • 预览:在屏幕上查看图片。
  • 图片分析:无缝访问缓冲区中的图片以便在算法中使用,例如将其传递到机器学习套件。
  • 图片拍摄:保存图片。
  • 视频拍摄:保存视频和音频。

使用SurfaceView加载相机预览界面

1,添加相机权限

   <uses-permission android:name="android.permission.CAMERA" />

2,页面布局,因为我项目需要的是一个扫描页面,所以我在底布局下填充了一个SurfaceView

    <SurfaceViewandroid:id="@+id/mSurfaceView"android:layout_width="match_parent"android:layout_height="match_parent" /><ImageViewandroid:id="@+id/view2"android:layout_width="0dp"android:layout_height="0dp"android:layout_margin="60dp"android:background="@drawable/rpa_huli_rzpz_bianjiao_icon"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintDimensionRatio="h,16:10"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/face_confirm"android:layout_width="@dimen/public_120_dp"android:layout_height="@dimen/public_60_dp"android:layout_marginTop="136dp"android:background="@color/detail_bu"android:text="识别"android:textColor="@color/white"android:textSize="24sp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@+id/view2" />

3,设置SurfaceHolder.callback开启和关闭相机预览功能。

    private val cpHolderCallback: SurfaceHolder.Callback = object : SurfaceHolder.Callback {override fun surfaceCreated(holder: SurfaceHolder) {camera?.setPreviewDisplay(holder)preview()//相机预览}override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int)       {}override fun surfaceDestroyed(holder: SurfaceHolder) {stopPreview()//关闭预览}}

4,初始化相机数据,加载相机预览

  runOnUiThread {camera = Camera.open(0)try {val parameters: Camera.Parameters = camera!!.parametersparameters.pictureFormat = ImageFormat.JPEG//设置图片属性//设置相机对焦模式,FOCUS_MODE_CONTINUOUS_PICTURE使用连续对焦parameters.focusMode = Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE//界面属性不一样,所以设置宽高处理界面异常拉伸val display = windowManager.defaultDisplayval height = display.heightval width = display.widthval preSize: Camera.Size =CameraUtils.getCloselyPreSize(true, width,height,parameters.supportedPreviewSizes)parameters.setPictureSize(preSize.width, preSize.height)camera!!.run {setParameters(parameters)setPreviewDisplay(mSurfaceView.holder)//设置将相机获取到的界面旋转90度显示setDisplayOrientation(90)startPreview()cancelAutoFocus()}safeToTakePicture = true} catch (e: IOException) {e.printStackTrace()}}

5,监听扫描按钮,获取到图片,这里因为是预览界面,所以和平时相机拍照的方法有一些区别,需要使用takePicture函数,三个参数我使用了图片回调,因为我需要得到图片。

 face_confirm.setOnClickListener {camera?.takePicture(null, null, Camera.PictureCallback { data, _ ->//data是ByteArray类型的,所以需要转换一下才能得到图片临时存放的地址pictureDataBytes = datastopPreview()//获取完之后停止相机预览活动...}).start()})}

6,ByteArray转换String函数,获取到图片的拼接地址。

   private fun PictureConversion(bytes: ByteArray?): String? {try {val f: File = File.createTempFile("img", ".jpg")val fos = FileOutputStream(f)fos.write(bytes)fos.flush()fos.close()return f.getAbsolutePath()} catch (e: IOException) {e.printStackTrace()}return ""}

Android CameraX和SurfaceView的基本使用相关推荐

  1. android surface编程,Android编程之SurfaceView实例详解

    本文实例讲述了Android编程之SurfaceView用法.分享给大家供大家参考,具体如下: 关于surfaceView相关知识: View和SurfaceView主要区别: 1. View只能在U ...

  2. Android CameraX的PreviewView Ar背景实景实时预览

    经常在AR开发过程中有这种需求:需要实时预览实景视频,如下图所示. 代码实现思路使用Android CameraX的PreviewView来实现,下面试代码,仅包含视频预览部分: 一.activity ...

  3. 【Android CameraX】CameraXBasic —— 官方CameraX实例源码分析

    一.简介 二.源码分析 2.1 build.gradle 2.2 代码结构 2.3 变量 2.3.1 lensFacing 2.3.2 preview 2.3.3 Image capture 2.3. ...

  4. Android中的SurfaceView详解

    Android中提供了View进行绘图处理,View可以满足大部分的绘图需求,但是有时候,View却显得力不从心,所以Android提供了SurfaceView给Android开发者,以满足更多的绘图 ...

  5. android之利用surfaceView实现自定义水印相机

    android之利用surfaceView实现自定义水印相机 知识点 1.自定义相机+预览相机 2.截屏拍照加水印 3.关于不使用intent来传输图片 4.关于大家说要demo的,因为这里是项目里头 ...

  6. Android截屏SurfaceView黑屏问题解决办法

    Android截屏SurfaceView黑屏问题解决办法 参考文章: (1)Android截屏SurfaceView黑屏问题解决办法 (2)https://www.cnblogs.com/kongyf ...

  7. android CameraX自定义相机使用

    android CameraX自定义相机使用 =<?xml version="1.0" encoding="utf-8"?> <android ...

  8. 采用Android的MediaPlayer+SurfaceView设计视频播放器

    前言 android视频播放有很多方式(自带videoView等),这里简单说其中一种:MediaPlayer+SurfaceView,一个播放音频,一个播放视频(图像). 大体结构图 BaseMed ...

  9. Android CameraSurfaceView在SurfaceView上实现拍照,视频录像

    实现拍照录像功能我们选择SurfaceView,利用android原生API进行拍,录像.满足简单的功能需求.无需继承第三方类库. import android.content.Context; im ...

最新文章

  1. Spring boot 各种入门及问题
  2. opencv python教程简书_Python-OpenCV —— 基本操作一网打尽
  3. 漫步线性代数十——线性无关,基和维数
  4. 3D 机器视觉 02 - FPGA生成N位元格雷码
  5. java 获取指定后缀名的文件
  6. echart 饼图图例legend支持滑动
  7. 转 黑客帝国解读 Matrix的世界
  8. Win7 64位系统安装 Windows XP 虚拟机
  9. 15s是什么意思c语言,15s是什么意思
  10. 10路智能电动自行车充电桩功能特点优势
  11. 接口测试与Postman
  12. 北京市211学校计算机专业,北京较容易考的2所211大学,王牌专业实力强悍,学生不愁就业...
  13. 【信息检索】Java简易搜索引擎原理及实现(三)B+树索引和轮排索引结构
  14. 玩转华为数据中心交换机系列 | 配置VLAN内协议报文透传示例
  15. MT6735 刷机时:brom error:s ft download fail 4008
  16. 【ZZULIOJ】1026: 字符类型判断
  17. HC110110019 FTP原理与配置
  18. Linux鸟哥的私房菜(硬件)
  19. Python编程:安装自己编写的包
  20. 【无人机】基于蒙特卡洛算法实现无人机任务分配模型附matlab代码

热门文章

  1. 基于PHP+MySQL婚介交友网站的设计与开发
  2. 带有华为功能的电脑与平板多屏协同遇到“已连接多台显示设备”问题解决方法
  3. 二次元属性被稀释,B站多了魔幻现实?
  4. 如何和女生聊天?哪些话题不过时
  5. TreeMap排序中遇到的问题
  6. 使用arduino输出QMC5883L的三轴磁场和YAW角
  7. 刷脸支付服务商百亿补贴打响市场争夺战
  8. windows之bat脚本控制adb命令实现:安卓手机定时循环开关飞行模式
  9. 【原创】ES5高效封装WIN10系统教程2020系列(二)准备封装环境
  10. scratch编程炫酷闪电特效