iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android 用 camera2 API 自定义相机
  • 958
分享到

Android 用 camera2 API 自定义相机

自定义相机apiAndroid 2022-06-06 01:06:55 958人浏览 安东尼
摘要

前言 笔者因为项目需要自定义相机,所以了解了一下 Android 关于 camera 这块的 api。Android SDK 21(LOLLIPOP) 开始已经弃用了之前的 C

前言

笔者因为项目需要自定义相机,所以了解了一下 Android 关于 camera 这块的 api。Android SDK 21(LOLLIPOP) 开始已经弃用了之前的 Camera 类,提供了 camera2 相关 API,目前网上关于 camera2 API 介绍的资料比较少,笔者搜集网上资料,结合自己的实践,在这里做一个总结

流程

因为 camera2 提供的接口比较多,虽然很灵活,但是也增加了使用的复杂度。首先来大致了解一下调用 camera2 的流程,方便我们理清思路。

要显示相机捕捉的画面,只需要三步:初始化相机,预览,更新预览。也就是上图中左侧的部分。要实现这三步,需要用到的主要接口类和它们的作用步骤如上图右侧部分所示。下面就用代码来详解一下。

案例

首先创建一个相机界面:

activity_camera.xml


<LinearLayout xmlns:android="Http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="vertical">
 <TextureView
  android:id="@+id/camera_texture_view"
  android:layout_width="match_parent"
  android:layout_height="match_parent" />
 <ImageButton
  android:id="@+id/capture_ib"
  android:layout_width="60dp"
  android:layout_height="60dp"
  android:layout_marginBottom="10dp"
  android:layout_gravity="bottom|center"
  android:background="@drawable/send_pres"/>
</LinearLayout>

界面很简单,只有一个 TexureView 和一个按钮。

接下来在 Activity 中初始化并显示相机捕捉的画面。

首先要解决的一个问题就是画面拉伸的问题。

要解决这个问题,首先要从 TextureView 下手。

CameraActivity.java


mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
  @Override
  public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
  mWidth = width;
  mHeight = height;
  getCameraId();
  openCamera();
  }
  @Override
  public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {
  }
  @Override
  public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
  return false;
  }
  @Override
  public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
  }
 });

在 onSurfaceTextureAvailable 中初始化相机。通过 CameraManager 对象 openCamera,这正是流程图中 Init 步骤中的第一步。openCamera 有三个参数,第一个是 String 类型的 cameraId,第二个是 CameraDevice.StateCallback,第三个是 Handler。这里我们要声明一个 StateCallback:


private CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() {
 @Override
 public void onOpened(CameraDevice cameraDevice) {
  mCameraDevice = cameraDevice;
  createCameraPreview();
 }
 @Override
 public void onDisconnected(CameraDevice cameraDevice) {
  mCameraDevice.close();
  mCameraDevice = null;
 }
 @Override
 public void onError(CameraDevice cameraDevice, int i) {
  mCameraDevice.close();
  mCameraDevice = null;
 }
 };

可以看到,在 camera 准备完毕之后就可以创建预览界面了。解决画面拉伸的问题就是要为预览界面设置一个合适比例的 SurfaceTexture buffer size。


private void createCameraPreview() {
 try {
  SurfaceTexture texture = mTextureView.getSurfaceTexture();
  assert texture != null;
  CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(mCameraId);
  StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
  int deviceOrientation = getWindowManager().getDefaultDisplay().getOrientation();
  int totalRotation = sensorToDeviceRotation(characteristics, deviceOrientation);
  boolean swapRotation = totalRotation == 90 || totalRotation == 270;
  int rotatedWidth = mWidth;
  int rotatedHeight = mHeight;
  if (swapRotation) {
  rotatedWidth = mHeight;
  rotatedHeight = mWidth;
  }
  mPreviewSize = getPreferredPreviewSize(map.getOutputSizes(SurfaceTexture.class), rotatedWidth, rotatedHeight);
  texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
  Log.e("CameraActivity", "OptimalSize width: " + mPreviewSize.getWidth() + " height: " + mPreviewSize.getHeight());
  ...

这里根据当前设备及传感器的旋转角度来判断是否交换宽高值,然后通过 CameraCharacteristics 来得到最适合当前大小比例的宽高,然后把这个宽高设置给 SurfaceTexture 。


private Size getPreferredPreviewSize(Size[] sizes, int width, int height) {
 List<Size> collectorSizes = new ArrayList<>();
 for (Size option : sizes) {
  if (width > height) {
  if (option.getWidth() > width && option.getHeight() > height) {
   collectorSizes.add(option);
  }
  } else {
  if (option.getHeight() > width && option.getWidth() > height) {
   collectorSizes.add(option);
  }
  }
 }
 if (collectorSizes.size() > 0) {
  return Collections.min(collectorSizes, new Comparator<Size>() {
  @Override
  public int compare(Size s1, Size s2) {
   return Long.signum(s1.getWidth() * s1.getHeight() - s2.getWidth() * s2.getHeight());
  }
  });
 }
 return sizes[0];
 }
这里 Sizes 是相机返回的支持的分辨率,从我们传递的参数找找到一个最接近的分辨率。
接下来就要通过 CaptureRequest.Builder以及 CameraCaptureSession.StateCallback 来创建及更新预览界面:
...
Surface surface = new Surface(texture);
  mBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
  // 设置预览对象
  mBuilder.addTarget(surface);
  mCameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
  @Override
  public void onConfigured(CameraCaptureSession cameraCaptureSession) {
   if (null == mCameraDevice) {
   return;
   }
   mSession = cameraCaptureSession;
   mBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
   try {
   // 不停地将捕捉的画面更新到 TextureView
   mSession.setRepeatingRequest(mBuilder.build(), mSessionCaptureCallback, mBackgroundHandler);
   } catch (CameraAccessException e) {
   e.printStackTrace();
   }
  }
  @Override
  public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
   Toast.makeText(CameraActivity.this, "Camera configuration change", Toast.LENGTH_SHORT).show();
  }
  }, null);
 } catch (CameraAccessException e) {
  e.printStackTrace();
 }

这样就完成了自定义相机第一步,源码地址请戳这里。下载地址:http://xiazai.jb51.net/201704/yuanma/camera2-master_jb51.rar

您可能感兴趣的文章:Android仿最新微信相机功能android 7自定义相机预览及拍照功能Android开源库自定义相机模块Android调用系统照相机拍照与摄像的方法Android如何调用系统相机拍照Android 照相机的实例应用Android 自定义相机及分析源码Android自定义照相机的实例Android相机启动加速详解


--结束END--

本文标题: Android 用 camera2 API 自定义相机

本文链接: https://www.lsjlt.com/news/21873.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android中怎么自定义相机
    本篇文章给大家分享的是有关Android中怎么自定义相机,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。使用Android 系统相机的方法:要想让应用有相机的action,咱们就...
    99+
    2023-05-30
    android
  • Android自定义照相机的实例
    Android自定义照相机实现近期小巫在学校有一个创新项目,也不是最近,是一个拖了很久的项目,之前一直没有去搞,最近因为要中期检查,搞得我跟小组成员一阵忙活,其实开发一款照相机软件并不太难,下面就是通过自定义的方式来实现手机照相的功能。创建...
    99+
    2023-05-31
    android自定义 照相机 roi
  • 怎么在Android 中利用camera2 API 实现一个相机功能
    怎么在Android 中利用camera2 API 实现一个相机功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。流程因为 camera2 提供的接口比较多,虽然很灵活,但是也...
    99+
    2023-05-31
    android camera2 api roi
  • Android自定义View实现相机对焦框
    前言 在相机APP中,手动对焦时都会出现一个对焦框,告诉用户相机正在对焦。那么这种对焦框是怎么实现的呢?最近项目中有几个需求,实现手动对焦,自动对焦和对焦框。总体来说不是很复杂,在这...
    99+
    2024-04-02
  • Android自定义相机、预览区域裁剪
    本文实例为大家分享了Android自定义相机,预览区域裁剪的具体代码,供大家参考,具体内容如下 写法一: 预览区域裁剪,方法调用: //按照比例进行裁剪头像区域 Bitmap   ...
    99+
    2024-04-02
  • 十分钟实现 Android Camera2 相机预览
    1. 前言 因为工作中要使用Android Camera2 API,但因为Camera2比较复杂,网上资料也比较乱,有一定入门门槛,所以花了几天时间系统研究了下,并在CSDN上记录了下,希望能帮助到更...
    99+
    2023-10-26
    android 相机 Camera2 音视频 预览
  • iOS自定义相机功能
    大多数app都会涉及到上传照片这个功能,图片来源无非是从相册获取或者相机拍摄。如果不是特别要求,调用系统已经满足需求。但对于特殊需求,就需要自定义相机拍摄界面了。 对于无需定制的相机...
    99+
    2024-04-02
  • uniapp怎么自定义相机
    这篇文章主要介绍“uniapp怎么自定义相机”,在日常操作中,相信很多人在uniapp怎么自定义相机问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”uniapp怎么自定义相机”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-05
  • 如何在Android中使用camera2 判断相机是否可用
    如何在Android中使用camera2 判断相机是否可用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先获取到设备等级:Float hardwareLevel = mC...
    99+
    2023-05-31
    android camera2 roi
  • Android CameraX如何结合LibYUV和GPUImage自定义相机滤镜
    这篇文章主要介绍了Android CameraX如何结合LibYUV和GPUImage自定义相机滤镜,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本文目录:实现效果...
    99+
    2023-06-21
  • Android项目中如何实现自定义相机预览界面
    Android项目中如何实现自定义相机预览界面?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。官方文档:public static void setCameraD...
    99+
    2023-05-31
    android roi 目中
  • uniapp自定义相机实现示例详解
    目录自定义相机起因利用livePusher实现使用效果图拓展实现多种自定义相机水印相机身份证相机人像相机自定义相机 起因 由于最近用uniapp调用原生相机容易出现闪退问题,找了很...
    99+
    2023-03-09
    uniapp自定义相机 uniapp 相机实现
  • AndroidCameraX结合LibYUV和GPUImage自定义相机滤镜
    目录实现效果实现步骤1.引入依赖库2.引入libyuv3.编写CameraX预览代码4.增加相机数据回调5.对回调数据进行处理6.拍摄照片 作者:itfitness 链接:https...
    99+
    2024-04-02
  • Android自定义PhotoView使用教程
    目录准备工作1、双击放大和缩小2、滑动和惯性滑动3、双指放大和缩小4、完整DEMO准备工作 自定义PhotoView 自定义 PhotoView 继承(extends)自 View。...
    99+
    2023-05-14
    Android PhotoView Android 自定义PhotoView
  • android 自定义控件 使用declare
    在Android中,可以使用`declare-styleable`来定义和使用自定义控件的属性。下面是一个简单的示例:1. 在res...
    99+
    2023-09-21
    Android
  • Android怎么自定义ProgressDialog使用
    要自定义ProgressDialog,可以按照以下步骤进行操作:1. 首先,创建一个新的类来扩展ProgressDialog类。例如...
    99+
    2023-08-09
    Android ProgressDialog
  • android怎么自定义viewgroup
    要自定义一个ViewGroup,你需要创建一个继承自ViewGroup的子类,并重写一些关键的方法来定义你的布局和子视图的排列方式。...
    99+
    2023-10-11
    android
  • Android怎么自定义View
    这篇文章主要介绍“Android怎么自定义View”,在日常操作中,相信很多人在Android怎么自定义View问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android怎么自定义View”的疑惑有所帮助!...
    99+
    2023-06-30
  • Android如何自定义Dialog
    本篇内容主要讲解“Android如何自定义Dialog”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android如何自定义Dialog”吧!接下来看代码:public class&n...
    99+
    2023-07-02
  • Android自定义View实现随机数验证码
    目录前言效果自定义 View 分类步骤1.自定义属性2.添加构造方法3.在构造里获取自定义样式4.重写 onDraw 计算坐标绘制5.重写 onMeasure 测量宽高6.设置点击事...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作