安卓 MediaStore 图像捕获预览显示方向错误

3
通过MediaStore.ACTION_IMAGE_CAPTURE意图捕获照片时,预览显示的方向不正确。这只发生在少数设备上。附上它的截图。照片是使用前置摄像头拍摄的。我们的应用程序已经处理了方向校正,因此当用户点击检查时,它处于正确的方向。问题实际上只是预览。

尝试使用 i.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION,ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); ,但它不起作用。是否有任何方法解决这个问题?还是我必须实现自定义相机?

编辑:我所说的预览是捕获照片后,在选择/最终确定捕获的照片之前显示的预览。在我们的情况下(如所附的截图所示), onActivityResult() 尚未被调用。点击检查按钮会调用 onActivityResult() 回调函数。

Taken with the front cam on portrait


找到解决方案了吗? - Emmanuel
抱歉 @Emmanuel,我找不到一个。 - PenguinBlues
1个回答

1
大多数手机相机都是横向的,这意味着如果你以纵向拍摄照片,得到的照片将会旋转90度。在这种情况下,相机软件应该填充EXIF数据,以便以正确的方向查看照片。 我从这里复制了这个答案 另一种方法是,你可以从相机获取旋转信息,然后对返回的图像进行任何你想要的处理。完整代码在这里 这个示例是关于图像选择器的,但是处理返回的图像的代码帮助我控制图像的旋转。
private int getRotationFromCamera(Context context, Uri imageFile) {
        int rotate = 0;
        try {

            context.getContentResolver().notifyChange(imageFile, null);
            ExifInterface exif = new ExifInterface(imageFile.getPath());
            int orientation = exif.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_NORMAL);

            switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_270:
                    rotate = 270;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    rotate = 180;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_90:
                    rotate = 90;
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rotate;
    }

实际上,我们没有问题将结果照片校正到正确的方向,因为在onActivityResult中,我们确定旋转方式与您答案中的方法类似。问题出在MediaStore.ACTION_IMAGE_CAPTURE意图上(无论它启动哪个相机应用程序,我都不知道),它显示的预览是错误的。我所指的预览是在捕获图像之后,在选择/完成捕获的图像之前显示的那个。 - PenguinBlues
拍摄完成后,您可以检查暂存的图像。该图像是否具有正确的方向? - Fuyuba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接