Android Camera2获取预览尺寸和fps范围
升降摄像头安卓手机刚上市的时候,有些很流行的app刚打开时,前置摄像头就升起来了。好像就是出来看一眼然后又收回去。
虽然我们不调用拍照功能,只是为了获取相机的信息,也是可能让摄像头升起来的。
Camera实现
使用android.hardware.Camera获取摄像头支持的预览尺寸和fps。
先Camera.open获取到camera实例,然后再camera.getParameters()。
for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
Camera camera = null;
try {
camera = Camera.open(i);
Parameters parameters = camera.getParameters();
supportedSizes = parameters.getSupportedPreviewSizes();
supportedFpsRanges = parameters.getSupportedPreviewFpsRange();
} catch (RuntimeException e) {
Log.e(TAG, "Failed to open, skipping", e);
continue;
} finally {
if (camera != null) {
camera.release();
}
}
}
android.hardware.Camera:下文简称为「camera」或者「camera1」。
上面的代码对于可升降摄像头手机(例如荣耀X10)来说,前置摄像头会升起来,然后又缩回去。用户体验不好。

可以用Camera2来实现,不用打开摄像头就能获取到相关信息。
Camera2
引入camera2
首先看模块的gradle。本文示例是放在模块里的。
我们需要引入androidx相关的包。
- compileSdk 31
- androidx.camera:camera-core:1.1.0-beta01
- androidx.camera:camera-camera2:1.1.0-beta01
apply plugin: 'com.android.library'
android {
compileSdk 31
defaultConfig {
minSdkVersion 19
targetSdkVersion 31
versionCode 110
versionName "1.1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.3.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation "androidx.camera:camera-core:1.1.0-beta01"
implementation "androidx.camera:camera-camera2:1.1.0-beta01"
}
注意这里minSdkVersion 19,后面使用的时候需要判断一下运行的Android版本
这里使用的是beta01版的camera2包,可以看出camera2仍在发展中
使用
部分导入的包的情况
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.os.Build;
用获取系统服务的方式来获取CameraManager,这里要求 API >= 21
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
CameraManager cameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
}
Camera2相比于camera1的一大不同是,Camera2不需要调用Camera.open方法,就能去查询相机的一些配置。
获取支持的尺寸。android.hardware包里的Camera.Size已经不推荐使用了(Deprecated)。Camera2用的是android.util.Size。
List<android.util.Size> supportedUtilSize = new ArrayList<>();
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics("0"); // 0和1
StreamConfigurationMap configs = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
supportedUtilSize = Arrays.asList(configs.getOutputSizes(ImageFormat.JPEG));
获取支持的fps范围,结果用Range来表示。
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics("1"); // 0和1
Range<Integer>[] ranges21 = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
注意上面的代码需要判断系统版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// 在这里面进行操作
}
Range介绍
获取fps数据时我们用到了Range类。
package android.util;
public final class Range<T extends Comparable<? super T>> {
它接受的范型要能够进行比较,即继承Comparable。前面的代码我们用的是Range。
package java.lang;
public final class Integer extends Number implements Comparable<Integer>
Range表示范围。它代表了一个范围,提供了一些常用的方法。比较类似数学中的集合的概念。
例如:
判断目标值是否在范围里public boolean contains(T value)
判断传入的范围是否在自己的范围里面public boolean contains(Range<T> range)
获取一个范围内的数值,即限制数值不能超过自己的范围 public T clamp(T value)。假设范围是0到10,传入12,则返回10,也就是上限。
参考
Android Camera2获取预览尺寸和fps范围的更多相关文章
- Android使用Camera2获取预览数据
一.Camera2简介 Camera2是Google在Android 5.0后推出的一个全新的相机API,Camera2和Camera没有继承关系,是完全重新设计的,且Camera2支持的功能也更加丰 ...
- Android 使用 Camera2 完成预览和拍照
Android API 21新增了Camera2,这与之前的camera架构完全不同,使用起来也比较复杂,但是功能变得很强大. 在讲解开启预览之前,首先需要了解camera2的几个比较重要的类: Ca ...
- Android远程桌面助手(B1185)for Android P开发者预览版
Android P的开发者预览版已出,其中App compatibility changes部分特别强调“The platform restricts the use of some non-SDK ...
- Android 10开发者预览版功能介绍
Android P的开发者预览版最亮眼的功能莫过于支持“刘海屏”等屏幕显示.同样在适配可折叠设备方面,Android Q的第一个开发者预览版也很“接地气”,谷歌早在去年11月就发布了对可折叠设备的支持 ...
- Android开启相机预览获取Yuv视频流数据
自定义SurfaceView 主要步骤: 实现SurfaceHolder.Callback接口,创建SurfaceView的生命周期 实现Camera.PreviewCallback接口,创建预览回调 ...
- 关于降低android手机摄像头预览分辨率
假设现在有这样一个需求需要一直开着手机摄像头 但是不做任何拍照动作 但是每个手机的相机分辨率都不同 而默认预览的时候参数是最大分辨率 这样有时候就回导致电量损耗的加快 所以我们可以采取降低相机分辨率的 ...
- android camera 摄像头预览画面变形
问题:最近在处理一下camera的问题,发现在竖屏时预览图像会变形,而横屏时正常.但有的手机则是横竖屏都会变形. 结果:解决了预览变形的问题,同时支持前后摄像头,预览无变形,拍照生成的jpg照片方向正 ...
- Android Studio无法预览xml布局之解决方法(两种)
学习安卓程序开发,用的Android Studio,发现怎么更改xml代码都没有想要的效果.如图 代码如下: <?xml version="1.0" encoding=&qu ...
- 乐橙平台大华监控Android端实时预览播放
一.初始化 首先我们需要到乐橙开放平台下载android对应的开发包,将sdk中提供的jar和so文件添加到项目中: 二.获取监控列表 监控列表我们是通过从自家后台服务器中获取的,这个自己根据需要调整 ...
随机推荐
- MongoDB之几种情况下的索引选择策略
一.MongoDB如何选择索引 如果我们在Collection建了5个index,那么当我们查询的时候,MongoDB会根据查询语句的筛选条件.sort排序等来定位可以使用的index作为候选索引:然 ...
- TensorRT 开始
TensorRT 是 NVIDIA 自家的高性能推理库,其 Getting Started 列出了各资料入口,如下: 本文基于当前的 TensorRT 8.2 版本,将一步步介绍从安装,直到加速推理自 ...
- Python常用的数据结构
一.list 列表 1.列表的特点 有序的,元素可以重复,列表中的元素可以进行增上改查,可以存放不同的数据类型 2.创建列表 中括号创建并填充 --->[] 通过构造函数创建 list() 列表 ...
- 关于Jmeter线程数Ramp-Up.循环次数的理解和实验数据
1. 关于线程组参数 线程组:即一个线程组实例里面包括多个串行的请求或动作.一个线程组的从启动到结束的时间取决于你线程中的步骤数量. 线程数:即用户数,在Ramp-up时间内(包括循环),简单把线程数 ...
- MySQL之MVCC与幻读
转自 https://blog.csdn.net/qq_31930499/article/details/110393988 如果是快照度,直接采用MVCC,如果是当前读,才会走next-key lo ...
- 流言粉碎机:JAVA使用 try catch 会严重影响性能
目录 一.JVM 异常处理逻辑 二.关于JVM的编译优化 1. 分层编译 2. 即时编译器 1. 解释模式 2. 编译模式 3. 提前编译器:jaotc 三.关于测试的约束 执行用时统计 编译器优化的 ...
- 集合框架-LinkedList集合练习(堆栈和队列)
1 package cn.itcast.p2.linkedlist.test; 2 3 import java.util.LinkedList; 4 5 /* 6 * 请使用LinkedList来模拟 ...
- 集合框架-工具类-Collections-折半最值
1 package cn.itcast.p2.toolclass.collections.demo; 2 3 import java.util.ArrayList; 4 import java.uti ...
- Nginx代理的方式(反向代理)
目录 一:Nginx 正向代理与反向代理 1.什么是代理服务器? 2.正向代理的概念 3. 反向代理的概念 二:Nginx代理服务支持的协议 三:Nginx代理实践 1.部署web01 2.部署lb0 ...
- Caffeine缓存 最快缓存 内存缓存
一.序言 Caffeine是一个进程内部缓存框架. 对比Guava Cache Caffeine是在Guava Cache的基础上做一层封装,性能有明显提高,二者同属于内存级本地缓存.使用Caffei ...