Camera Intent Image Preview Ориентация - PullRequest
0 голосов
/ 10 ноября 2018

Я снимаю изображение в Android, используя следующий код:

File image = new File(this.images_object_dir, loadedObjekt.getFilename());

Uri uri = FileProvider.getUriForFile(this, FILE_PROVIDER, image);

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, CAMERA_ACTIVITY_CODE);

В намерении камеры предварительный просмотр изображения всегда выполняется в портретном режиме на моем Huawei P20 Pro. На другом тестовом устройстве изображение предварительного просмотра (то, где вы можете решить, хотите ли вы восстановить изображение) также застревает в «начальном» вращении, которое выглядит некрасиво. Например, если вы хотите сделать снимок в ландшафтном режиме, предварительный просмотр переключается в портретный режим.

Есть ли решение для этого?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Используйте ExifInterface, чтобы проверить ориентацию изображения при его декодировании. Затем вы поворачиваете изображение, чтобы получить требуемое изображение в правильной ориентации.

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inMutable = true;
        Bitmap decoded = BitmapFactory.decodeFile(filePath, options);

        if (decoded == null) return null;

        try {
            ExifInterface exif = new ExifInterface(filePath);
            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_NORMAL);
            int rotation = 0;
            if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
                rotation = 90;
            } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
                rotation = 270;
            } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
                rotation = 180;
            }

            if (rotation != 0) {
                Matrix matrix = new Matrix();
                matrix.postRotate(rotation);
                Bitmap newBitmap = Bitmap.createBitmap(decoded, 0, 0, decoded.getWidth(),
                        decoded.getHeight(), matrix, true);
                decoded.recycle();
                Runtime.getRuntime().gc();
                decoded = newBitmap;
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

Если вы хотите использовать библиотеку поддержки для поддержки устройств с более низкими уровнями API, используйте следующую зависимость:

implementation 'com.android.support:exifinterface:27.1.1'

и импорт android.support.media.ExifInterface

0 голосов
/ 10 ноября 2018

Существует около 2 миллиардов устройств Android, распространяемых на ~ 20 000 моделей устройств.Существуют десятки, если не сотни, предустановленных приложений для камер на этих моделях устройств.Существует множество других приложений камеры, которые пользователь может загрузить и установить.

Ваш код может запустить любое из них.

В намерении камеры предварительный просмотр изображения всегда в портретной ориентации.режим на моем Huawei P20 Pro

Это поведение одного приложения камеры из сотен.

На другом тестовом устройстве изображение предварительного просмотра (то, где выможет решить, хотите ли вы заново захватить изображение), застрявшее в «начальном» вращении, которое выглядит некрасиво.

Это поведение одного приложения камеры из сотен.

Приложение для камеры не должно вести себя таким образом.Конечно, для приложения камеры вообще не требуется предварительный просмотр изображений.

Есть ли решение для этого?

Если вы хотите использовать ACTION_IMAGE_CAPTURE нетПоведение этих сотен приложений для камеры зависит от разработчиков этих приложений для камеры, а не от вас.

Существуют и другие варианты фотографирования, например непосредственное использование API-интерфейсов камеры или использование сторонних библиотек, таких как Fotoapparat.или CameraKit-Android.

...