Camera2 1440x1080 максимально - PullRequest
       7

Camera2 1440x1080 максимально

0 голосов
/ 17 сентября 2018

Я пытаюсь отобразить обычный предварительный просмотр Full HD в альбомной ориентации (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);
    }

Из официального образца https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java#L740

Разве Camera2 не должна облегчать жизнь, чем устаревшая камера?Я не уверен ...

Хотя я вижу одну хорошую вещь: мы можем установить много наземных целей, с устаревшей камерой мы не могли бы использовать setPreviewDisplay и setPreviewTexture вместе, но Camera2 допускает много выходов

ОБНОВЛЕНИЕ

ОМГ!

Следующая информация шокировала меня:

enter image description here

ps Я тестировал на устройстве Xiaomi

Камера Android2 Размеры вывода

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

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

1 Ответ

0 голосов
/ 31 марта 2019

TL; DR Если у вас есть CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY, по сути, ваш производитель телефонов не поддерживает Camera API2.

Для тех, кто в конечном итоге здесь, как я, вы можете найти объяснение в этомсвязанный вопрос и этот вопрос github .

...