android - Camera2 1440x1080 是最大值

标签 android android-camera2

我正在尝试使用 Camera2 以横向 (1920x1080) 显示正常的全高清预览,但相机返回 1440x1080 作为最高分辨率。

使用 Legacy Camera (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);
    }

来自官方样本https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java#L740

难道 Camera2 不是应该比传统相机更容易吗?我不确定...

虽然我看到了一件好事:我们可以设置许多表面目标,使用传统相机我们不能同时使用 setPreviewDisplaysetPreviewTexture,但 Camera2 允许许多输出

更新

我的天啊!

接下来的信息震惊了我:

enter image description here

附注我在小米设备上测试过

Android Camera2 Output sizes

https://github.com/googlesamples/android-Camera2Basic/issues/113

https://github.com/googlesamples/android-Camera2Basic/issues/123

最佳答案

长话短说 如果您有 CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY,基本上您的手机制造商不支持 Camera API2。

对于像我一样最终来到这里的人,您可以在相关的 question 中找到解释。还有这个github issue .

关于android - Camera2 1440x1080 是最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52374888/

相关文章:

android - Cordova/Phonegap 获取设备的电话号码 (Android & iOS)

android - 如何使用 Android 的 camera 或 camera2 API 来支持新旧 API 版本而没有弃用说明?

android - 在 CameraX 中使用 CameraCaptureSession.CaptureCallback()

java - 由于图像读取器表面,基于camera2 API的应用程序在某些设备中崩溃

android - 我如何模拟和测试这个类?

android - 联想设备中 RTL 语言的 EditText.setText() 方法中的奇怪错误

android - 从gradle文件中的jar中排除lib

java - Eclipse - 我在窗口首选项中设置了 Java 1.6,但编译器给出了有关 @Override 的错误

java - AutoFitTextureView 无法解析 Android Studio 中的符号

java - 如何禁用 Android Camera2 API 中的所有自动功能