【日常技术】关于三星机型拍照后图片信息会默认旋转90度问题

315 阅读1分钟

问题描述

在做项目适配的时候发现,我从相册选取图片进行的时候,发现三星手机的照片是默认旋转90度的,这样导致自己通过该照片做一定处理后,出来的结果是横屏的,所以需要自己去做相关旋转偏移

f379713fe910d302f0c105590bd1bc13a198a6735c4e663e2d537a79d0ec48e9QzpcVXNlcnNcSmFja3lcQXBwRGF0YVxSb2FtaW5nXERpbmdUYWxrXDEyOTQ3MjY1NzVfdjJcSW1hZ2VGaWxlc1wxNjQxMzU1NzM4MTIyXzFBNTcyNjIwLTVDOTQtNDJlYy1BNkM4LTg4RDY3MTNGQkRENS5wbmc=.png

关于ExifInterface获取

目前AndroidQ是拿不到path路径的,故之前的那种拿取exifInterface的方式已经不可取了,虽然Android11又可以开放了,但是还是要做相应的适配

try {
            ExifInterface exifInterface = new ExifInterface(filePath);
            int orientation = exifInterface.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_NORMAL
            );
            switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_90:
                    return 90;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    return 180;
                case ExifInterface.ORIENTATION_ROTATE_270:
                    return 270;
                default:
                    return 0;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return -1;
        }
  • 由于这里exifInterface需要传入图片的路径
  • 考虑过获取当前的保存的图片路径和已经原来的图片路径,然后进行但是对于绝对路径目前AndroidQ是拿不到的,然后本地保存的图片路径由于使用BitmapCmpress都压缩过了,导致exifInterface的信息丢失了,所以有了以下方法进行解决

解决方法

可以通过MediaStore.Images.ImageColumns.ORIENTATION这个属性获取图片的方向

private fun getOrientation(context: Context, uri: Uri): Int {
        val cursor: Cursor? = context.contentResolver.query(
            uri,
            arrayOf(MediaStore.Images.ImageColumns.ORIENTATION),
            null, null, null
        )
        var result = -1
        if (null != cursor) {
            if (cursor.moveToFirst()) {
                result = cursor.getInt(0)
            }
            cursor.close()
        }
        return result
    }

这样通过拿取图片的uri去获取了该图片的ORIENTATION方向属性,如此就拿到了图片实际的方向