Search code examples
androidpicassoandroid-10.0

picasso image rotation issue in android 10 using Uri of image


Picasso has an image rotation issue when showing it in android 10 using Uri of image

Uri uri = "content://media/external/images/media/12155";
Picasso.get().load(uri).into(imageView);

I'm used the last version 2.8

Roation issue

this is the original image

original image

this issue not found if android API 28 for example the issue happened with greater than or equals to android 29


Solution

  • This class solve the issue

    https://daniel.perez.sh/blog/2015/image-orientation-picasso/

    package com.example.util;
    
    import android.annotation.TargetApi;
    import android.content.Context;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.Matrix;
    import android.net.Uri;
    import android.os.Build;
    import android.provider.MediaStore;
    
    import com.squareup.picasso.Transformation;
    
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public class ExifTransformation implements Transformation {
        private static final String[] CONTENT_ORIENTATION = new String[] {
                MediaStore.Images.ImageColumns.ORIENTATION
        };
    
        final Context context;
        final Uri uri;
    
        public ExifTransformation(Context context, Uri uri) {
            this.context = context;
            this.uri = uri;
        }
    
        @Override
        public Bitmap transform(Bitmap source) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return source;
    
            int exifRotation = getExifOrientation(context, uri);
            if (exifRotation != 0) {
                Matrix matrix = new Matrix();
                matrix.preRotate(exifRotation);
    
                Bitmap rotated =
                        Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
                if (rotated != source) {
                    source.recycle();
                }
                return rotated;
            }
    
            return source;
        }
    
        @Override
        public String key() {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return "documentTransform()";
            return "documentExifTransform(" + uri.toString() + ")";
        }
    
        public static int getExifOrientation(Context context, Uri photoUri) {
            Cursor cursor = context.getContentResolver().query(photoUri, CONTENT_ORIENTATION, null, null, null);
    
            if (cursor.getCount() != 1) {
                return -1;
            }
    
            cursor.moveToFirst();
            return cursor.getInt(0);
        }
    }
    

    When loading the image, the following then gave the wanted result:

    Picasso
        .with(this)
        .load(uri)
        .transform(new ExifTransformation(this, uri))
        .into(imageView);