相机意图图像预览方向

时间:2018-11-10 15:46:40

标签: java android android-intent camera

我使用以下代码在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 :(得分:2)

大约有20亿个Android设备,分布在约20,000个设备模型中。这些设备型号中有数十个(甚至数百个)预装的相机应用程序。用户还可以下载并安装其他许多相机应用程序。

您的代码可能会启动其中任何一个。

  

出于摄影意图,我的Huawei P20 Pro上的图像预览始终处于纵向模式

这就是数百个相机应用程序的行为。

  

在另一台测试设备上,预览图像(您可以决定是否要重新拍摄该图像)也卡在“初始”旋转中,看起来很丑。

这就是数百个相机应用程序的行为。

相机应用程序无需以这种方式运行。当然,相机应用程序完全不需要预览图像。

  

有解决方案吗?

如果您想使用ACTION_IMAGE_CAPTURE,则不会。数百种相机应用程序的行为取决于这些相机应用程序的开发人员,而不是您自己。

还有其他用于拍照的选项,例如直接使用相机API或使用第三方库(例如Fotoapparat或CameraKit-Android)。

答案 1 :(得分:0)

在解码图像时,使用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