diff options
author | James Wei <jameswei@google.com> | 2019-12-24 19:12:29 +0800 |
---|---|---|
committer | James Wei <jameswei@google.com> | 2020-01-22 09:38:59 +0000 |
commit | bb3f54823423d34909bf219cbc44c81e9d7599bf (patch) | |
tree | c16d7366d8d4d25d4cb921124bd55516812e5123 /media/java/android/mtp/MtpDatabase.java | |
parent | 7f7c31f9d5b6cb7f60351a66c5d087167ddd8e31 (diff) |
MTP: Add MTP Thumbnail feature
Add thumbnail support for more supported image & video format
Bug: 117863715
Test: atest MtpTests
Test: manual test on Windows 10 file explorer
Test: manual test on Linux nautilus file browser
Change-Id: Id973db64683dbdb75f1fe97cae8439bab6cdcb57
Diffstat (limited to 'media/java/android/mtp/MtpDatabase.java')
-rwxr-xr-x | media/java/android/mtp/MtpDatabase.java | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index f3c071a06eba..c5a2fd90af31 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -27,7 +27,9 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; +import android.graphics.Bitmap; import android.media.ExifInterface; +import android.media.ThumbnailUtils; import android.net.Uri; import android.os.BatteryManager; import android.os.RemoteException; @@ -49,6 +51,7 @@ import dalvik.system.CloseGuard; import com.google.android.collect.Sets; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.nio.file.Path; @@ -71,6 +74,7 @@ import java.util.stream.IntStream; */ public class MtpDatabase implements AutoCloseable { private static final String TAG = MtpDatabase.class.getSimpleName(); + private static final int MAX_THUMB_SIZE = (200 * 1024); private final Context mContext; private final ContentProviderClient mMediaProvider; @@ -802,6 +806,28 @@ public class MtpDatabase implements AutoCloseable { return obj.getFormat(); } + private byte[] getThumbnailProcess(String path, Bitmap bitmap) { + try { + if (bitmap == null) { + Log.d(TAG, "getThumbnailProcess: Fail to generate thumbnail. Probably unsupported or corrupted image"); + return null; + } + + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteStream); + + if (byteStream.size() > MAX_THUMB_SIZE) + return null; + + byte[] byteArray = byteStream.toByteArray(); + + return byteArray; + } catch (OutOfMemoryError oomEx) { + Log.w(TAG, "OutOfMemoryError:" + oomEx); + } + return null; + } + @VisibleForNative private boolean getThumbnailInfo(int handle, long[] outLongs) { MtpStorageManager.MtpObject obj = mManager.getObject(handle); @@ -824,6 +850,16 @@ public class MtpDatabase implements AutoCloseable { } catch (IOException e) { // ignore and fall through } + +// Note: above formats will fall through and go on below thumbnail generation if Exif processing fails + case MtpConstants.FORMAT_PNG: + case MtpConstants.FORMAT_GIF: + case MtpConstants.FORMAT_BMP: + outLongs[0] = MAX_THUMB_SIZE; + // only non-zero Width & Height needed. Actual size will be retrieved upon getThumbnailData by Host + outLongs[1] = 320; + outLongs[2] = 240; + return true; } return false; } @@ -846,6 +882,17 @@ public class MtpDatabase implements AutoCloseable { } catch (IOException e) { // ignore and fall through } + +// Note: above formats will fall through and go on below thumbnail generation if Exif processing fails + case MtpConstants.FORMAT_PNG: + case MtpConstants.FORMAT_GIF: + case MtpConstants.FORMAT_BMP: + { + Bitmap bitmap = ThumbnailUtils.createImageThumbnail(path, MediaStore.Images.Thumbnails.MINI_KIND); + byte[] byteArray = getThumbnailProcess(path, bitmap); + + return byteArray; + } } return null; } |