android - Camera2 1440x1080 为最大值
问题描述
我正在尝试使用 以横向(1920x1080)显示正常的全高清预览Camera2
,但相机返回 1440x1080 作为最高分辨率。
使用旧版相机 ( android.hardware.camera
),同一设备没有此类问题。我究竟做错了什么?
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
cameraId = manager.getCameraIdList()[0];
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
assert map != null;
imageDimension = map.getOutputSizes(SurfaceTexture.class)[0];
for (Size size : map.getOutputSizes(SurfaceTexture.class)) {
Log.i(TAG, "imageDimension " + size);
}
输出:
imageDimension 1440x1080
imageDimension 1280x960
imageDimension 1280x720
imageDimension 864x480
imageDimension 640x640
imageDimension 832x486
imageDimension 800x480
imageDimension 720x480
imageDimension 768x432
imageDimension 640x480
此外,要正确显示横向预览,我们似乎需要很多令人头疼的代码,例如:
private void configureTransform(int viewWidth, int viewHeight) {
Activity activity = getActivity();
if (null == mTextureView || null == mPreviewSize || null == activity) {
return;
}
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
Matrix matrix = new Matrix();
RectF viewRect = new RectF(0, 0, viewWidth, viewHeight);
RectF bufferRect = new RectF(0, 0, mPreviewSize.getHeight(), mPreviewSize.getWidth());
float centerX = viewRect.centerX();
float centerY = viewRect.centerY();
if (Surface.ROTATION_90 == rotation || Surface.ROTATION_270 == rotation) {
bufferRect.offset(centerX - bufferRect.centerX(), centerY - bufferRect.centerY());
matrix.setRectToRect(viewRect, bufferRect, Matrix.ScaleToFit.FILL);
float scale = Math.max(
(float) viewHeight / mPreviewSize.getHeight(),
(float) viewWidth / mPreviewSize.getWidth());
matrix.postScale(scale, scale, centerX, centerY);
matrix.postRotate(90 * (rotation - 2), centerX, centerY);
} else if (Surface.ROTATION_180 == rotation) {
matrix.postRotate(180, centerX, centerY);
}
mTextureView.setTransform(matrix);
}
Camera2 不应该比传统相机更容易吗?我不确定...
虽然我看到一件好事:我们可以设置许多表面目标,使用我们无法使用的旧相机setPreviewDisplay
并setPreviewTexture
一起使用,但 Camera2 允许许多输出
更新
我的天啊!
接下来的信息让我震惊:
ps 我在小米设备上测试过
https://github.com/googlesamples/android-Camera2Basic/issues/113
https://github.com/googlesamples/android-Camera2Basic/issues/123
解决方案
推荐阅读
- amazon-ecs - 使用 aws cli 取消注册 ecs 中最旧的任务定义
- mysql - 在 MySQL 中使用带有别名的 HAVING 时出现问题
- java - 将包含表情符号的 Clob 转换为 Java 中的字符串
- java - 如何从 colors.xml 中获取颜色并将其设置在 strings.xml 文件中
- c# - Kendo Grid ASP .NET Core 获取值逗号分隔的服务器过滤
- python - 使用多列的自定义顺序重新排序 Pandas 数据框的行
- shell - 删除文件的前 N 和最后 M 个字符
- flutter - 颤振:如何在 api 正文中传递文本字段值
- amazon-web-services - 我丢失了我的一个 EC2 实例的 pem 文件。通过替换此实例的根卷中的授权密钥来恢复实例没有运气
- python-3.x - 有没有办法直接从 docx 段落而不是从元数据中获取 docx 文件的标题?