diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java index 22ce39d1784a1..fd81178d2cfbf 100644 --- a/core/java/android/provider/DocumentsContract.java +++ b/core/java/android/provider/DocumentsContract.java @@ -36,7 +36,6 @@ import android.graphics.Bitmap; import android.graphics.ImageDecoder; import android.graphics.Point; import android.media.ExifInterface; -import android.media.MediaFile; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -1681,46 +1680,35 @@ public final class DocumentsContract { public static AssetFileDescriptor openImageThumbnail(File file) throws FileNotFoundException { final ParcelFileDescriptor pfd = ParcelFileDescriptor.open( file, ParcelFileDescriptor.MODE_READ_ONLY); - Bundle extras = null; - try { final ExifInterface exif = new ExifInterface(file.getAbsolutePath()); - switch (exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1)) { - case ExifInterface.ORIENTATION_ROTATE_90: - extras = new Bundle(1); - extras.putInt(EXTRA_ORIENTATION, 90); - break; - case ExifInterface.ORIENTATION_ROTATE_180: - extras = new Bundle(1); - extras.putInt(EXTRA_ORIENTATION, 180); - break; - case ExifInterface.ORIENTATION_ROTATE_270: - extras = new Bundle(1); - extras.putInt(EXTRA_ORIENTATION, 270); - break; - } - final long[] thumb = exif.getThumbnailRange(); if (thumb != null) { + // If we use thumb to decode, we need to handle the rotation by ourselves. + Bundle extras = null; + switch (exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1)) { + case ExifInterface.ORIENTATION_ROTATE_90: + extras = new Bundle(1); + extras.putInt(EXTRA_ORIENTATION, 90); + break; + case ExifInterface.ORIENTATION_ROTATE_180: + extras = new Bundle(1); + extras.putInt(EXTRA_ORIENTATION, 180); + break; + case ExifInterface.ORIENTATION_ROTATE_270: + extras = new Bundle(1); + extras.putInt(EXTRA_ORIENTATION, 270); + break; + } + return new AssetFileDescriptor(pfd, thumb[0], thumb[1], extras); } } catch (IOException e) { } - // Use ImageDecoder to do full image decode of heif format file - // will have right orientation. So, we don't need to add orientation - // information into extras. - final String mimeType = MediaFile.getMimeTypeForFile(file.getName()); - if (mimeType.equals("image/heif") - || mimeType.equals("image/heif-sequence") - || mimeType.equals("image/heic") - || mimeType.equals("image/heic-sequence")) { - return new AssetFileDescriptor(pfd, 0 /* startOffset */, - AssetFileDescriptor.UNKNOWN_LENGTH, null /* extras */); - } - - return new AssetFileDescriptor(pfd, 0, AssetFileDescriptor.UNKNOWN_LENGTH, extras); + // Do full file decoding, we don't need to handle the orientation + return new AssetFileDescriptor(pfd, 0, AssetFileDescriptor.UNKNOWN_LENGTH, null); } private static void rethrowIfNecessary(Exception e) throws FileNotFoundException { diff --git a/media/java/android/media/ThumbnailUtils.java b/media/java/android/media/ThumbnailUtils.java index b3c2bb78862a9..534d63b4cca01 100644 --- a/media/java/android/media/ThumbnailUtils.java +++ b/media/java/android/media/ThumbnailUtils.java @@ -265,13 +265,10 @@ public class ThumbnailUtils { } } - boolean isHeifFile = false; - if (mimeType.equals("image/heif") || mimeType.equals("image/heif-sequence") || mimeType.equals("image/heic") || mimeType.equals("image/heic-sequence")) { - isHeifFile = true; try (MediaMetadataRetriever retriever = new MediaMetadataRetriever()) { retriever.setDataSource(file.getAbsolutePath()); bitmap = retriever.getThumbnailImageAtIndex(-1, @@ -298,11 +295,8 @@ public class ThumbnailUtils { if (bitmap == null) { bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(file), resizer); - // Use ImageDecoder to do full image decode of heif format file - // will have right orientation. Don't rotate the bitmap again. - if (isHeifFile) { - return bitmap; - } + // Use ImageDecoder to do full file decoding, we don't need to handle the orientation + return bitmap; } // Transform the bitmap if the orientation of the image is not 0.