Thumbnail.java revision a907c122ccec649c6cedf3a45b1c426a5fca932e
18ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li/*
28ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * Copyright (C) 2011 The Android Open Source Project
38ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li *
48ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * Licensed under the Apache License, Version 2.0 (the "License");
58ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * you may not use this file except in compliance with the License.
68ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * You may obtain a copy of the License at
78ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li *
88ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li *      http://www.apache.org/licenses/LICENSE-2.0
98ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li *
108ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * Unless required by applicable law or agreed to in writing, software
118ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * distributed under the License is distributed on an "AS IS" BASIS,
128ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * See the License for the specific language governing permissions and
148ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li * limitations under the License.
158ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li */
168ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
178ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Lipackage com.android.camera;
188ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
198ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport android.content.ContentResolver;
208ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport android.content.ContentUris;
218ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport android.database.Cursor;
228ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport android.graphics.Bitmap;
238ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport android.graphics.BitmapFactory;
248ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport android.graphics.Matrix;
258ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport android.net.Uri;
268ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport android.provider.MediaStore.Images;
278ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport android.provider.MediaStore.Images.ImageColumns;
281c4edcb4f6c50997b534ac83712cc4c49531a5cbWu-cheng Liimport android.provider.MediaStore.MediaColumns;
298ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport android.provider.MediaStore.Video;
308ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport android.provider.MediaStore.Video.VideoColumns;
318ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport android.util.Log;
328ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
338ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport java.io.BufferedInputStream;
348ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport java.io.BufferedOutputStream;
358ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport java.io.DataInputStream;
368ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport java.io.DataOutputStream;
37631191d322e0ae0fb3d5369e581cd8fd787c3b04Wu-cheng Liimport java.io.File;
388ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport java.io.FileInputStream;
398ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport java.io.FileOutputStream;
408ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Liimport java.io.IOException;
41423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo syncimport java.lang.IllegalArgumentException;
428ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
43a907c122ccec649c6cedf3a45b1c426a5fca932eAngus Kongpublic class Thumbnail {
448ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    private static final String TAG = "Thumbnail";
458ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
468ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    private static final int BUFSIZE = 4096;
478ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
488ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    private Uri mUri;
498ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    private Bitmap mBitmap;
508ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
518ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    public Thumbnail(Uri uri, Bitmap bitmap, int orientation) {
528ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        mUri = uri;
538ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        mBitmap = rotateImage(bitmap, orientation);
54423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync        if (mBitmap == null) throw new IllegalArgumentException("null bitmap");
558ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    }
568ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
578ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    public Uri getUri() {
588ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        return mUri;
598ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    }
608ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
618ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    public Bitmap getBitmap() {
628ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        return mBitmap;
638ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    }
648ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
658ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    private static Bitmap rotateImage(Bitmap bitmap, int orientation) {
668ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        if (orientation != 0) {
678ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            // We only rotate the thumbnail once even if we get OOM.
688ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            Matrix m = new Matrix();
698ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            m.setRotate(orientation, bitmap.getWidth() * 0.5f,
708ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                    bitmap.getHeight() * 0.5f);
718ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
728ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            try {
738ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                Bitmap rotated = Bitmap.createBitmap(bitmap, 0, 0,
748ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                        bitmap.getWidth(), bitmap.getHeight(), m, true);
75423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync                // If the rotated bitmap is the original bitmap, then it
76423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync                // should not be recycled.
77423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync                if (rotated != bitmap) bitmap.recycle();
788ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                return rotated;
798ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            } catch (Throwable t) {
808ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                Log.w(TAG, "Failed to rotate thumbnail", t);
818ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            }
828ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        }
838ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        return bitmap;
848ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    }
858ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
868ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    // Stores the bitmap to the specified file.
87631191d322e0ae0fb3d5369e581cd8fd787c3b04Wu-cheng Li    public void saveTo(File file) {
888ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        FileOutputStream f = null;
898ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        BufferedOutputStream b = null;
908ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        DataOutputStream d = null;
918ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        try {
92631191d322e0ae0fb3d5369e581cd8fd787c3b04Wu-cheng Li            f = new FileOutputStream(file);
938ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            b = new BufferedOutputStream(f, BUFSIZE);
948ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            d = new DataOutputStream(b);
958ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            d.writeUTF(mUri.toString());
968ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            mBitmap.compress(Bitmap.CompressFormat.PNG, 100, d);
978ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            d.close();
988ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        } catch (IOException e) {
99631191d322e0ae0fb3d5369e581cd8fd787c3b04Wu-cheng Li            Log.e(TAG, "Fail to store bitmap. path=" + file.getPath(), e);
1008ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        } finally {
1018ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            Util.closeSilently(f);
1028ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            Util.closeSilently(b);
1038ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            Util.closeSilently(d);
1048ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        }
1058ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    }
1068ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
1078ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    // Loads the data from the specified file.
1088ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    // Returns null if failure.
109631191d322e0ae0fb3d5369e581cd8fd787c3b04Wu-cheng Li    public static Thumbnail loadFrom(File file) {
1108ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        Uri uri = null;
1118ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        Bitmap bitmap = null;
1128ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        FileInputStream f = null;
1138ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        BufferedInputStream b = null;
1148ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        DataInputStream d = null;
1158ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        try {
116631191d322e0ae0fb3d5369e581cd8fd787c3b04Wu-cheng Li            f = new FileInputStream(file);
1178ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            b = new BufferedInputStream(f, BUFSIZE);
1188ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            d = new DataInputStream(b);
1198ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            uri = Uri.parse(d.readUTF());
1208ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            bitmap = BitmapFactory.decodeStream(d);
1218ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            d.close();
1228ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        } catch (IOException e) {
1238ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            Log.i(TAG, "Fail to load bitmap. " + e);
1248ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            return null;
1258ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        } finally {
1268ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            Util.closeSilently(f);
1278ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            Util.closeSilently(b);
1288ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            Util.closeSilently(d);
1298ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        }
130423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync        return createThumbnail(uri, bitmap, 0);
1318ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    }
1328ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
1338ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    public static Thumbnail getLastImageThumbnail(ContentResolver resolver) {
1348ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        Uri baseUri = Images.Media.EXTERNAL_CONTENT_URI;
1358ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
1368ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        Uri query = baseUri.buildUpon().appendQueryParameter("limit", "1").build();
1378ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        String[] projection = new String[] {ImageColumns._ID, ImageColumns.ORIENTATION};
1388ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        String selection = ImageColumns.MIME_TYPE + "='image/jpeg' AND " +
1398ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                ImageColumns.BUCKET_ID + '=' + Storage.BUCKET_ID;
1408ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        String order = ImageColumns.DATE_TAKEN + " DESC," + ImageColumns._ID + " DESC";
1418ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
1428ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        Cursor cursor = null;
1438ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        try {
1448ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            cursor = resolver.query(query, projection, selection, null, order);
1458ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            if (cursor != null && cursor.moveToFirst()) {
1468ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                long id = cursor.getLong(0);
1478ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                int orientation = cursor.getInt(1);
1488ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                Bitmap bitmap = Images.Thumbnails.getThumbnail(resolver, id,
1491c24f5161cfc6a78e45da5f564626d06f6278f7cWu-cheng Li                        Images.Thumbnails.MINI_KIND, null);
1508ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                Uri uri = ContentUris.withAppendedId(baseUri, id);
1518ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                // Ensure there's no OOM. Ensure database and storage are in sync.
152423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync                if (Util.isUriValid(uri, resolver)) {
153423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync                    return createThumbnail(uri, bitmap, orientation);
1548ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                }
1558ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            }
1568ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        } finally {
1578ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            if (cursor != null) {
1588ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                cursor.close();
1598ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            }
1608ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        }
1618ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        return null;
1628ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    }
1638ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
1648ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    public static Thumbnail getLastVideoThumbnail(ContentResolver resolver) {
1658ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        Uri baseUri = Video.Media.EXTERNAL_CONTENT_URI;
1668ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
1678ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        Uri query = baseUri.buildUpon().appendQueryParameter("limit", "1").build();
1681c4edcb4f6c50997b534ac83712cc4c49531a5cbWu-cheng Li        String[] projection = new String[] {VideoColumns._ID, MediaColumns.DATA};
1698ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        String selection = VideoColumns.BUCKET_ID + '=' + Storage.BUCKET_ID;
1708ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        String order = VideoColumns.DATE_TAKEN + " DESC," + VideoColumns._ID + " DESC";
1718ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
1728ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        Cursor cursor = null;
1738ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        try {
1748ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            cursor = resolver.query(query, projection, selection, null, order);
1758ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            if (cursor != null && cursor.moveToFirst()) {
1761c4edcb4f6c50997b534ac83712cc4c49531a5cbWu-cheng Li                Log.d(TAG, "getLastVideoThumbnail: " + cursor.getString(1));
1778ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                long id = cursor.getLong(0);
1788ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                Bitmap bitmap = Video.Thumbnails.getThumbnail(resolver, id,
1791c24f5161cfc6a78e45da5f564626d06f6278f7cWu-cheng Li                        Video.Thumbnails.MINI_KIND, null);
1808ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                Uri uri = ContentUris.withAppendedId(baseUri, id);
1818ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                // Ensure there's no OOM. Ensure database and storage are in sync.
182423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync                if (Util.isUriValid(uri, resolver)) {
183423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync                    return createThumbnail(uri, bitmap, 0);
1848ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                }
1858ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            }
1868ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        } finally {
1878ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            if (cursor != null) {
1888ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li                cursor.close();
1898ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            }
1908ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        }
1918ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        return null;
1928ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    }
1938ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li
1941c24f5161cfc6a78e45da5f564626d06f6278f7cWu-cheng Li    public static Thumbnail createThumbnail(byte[] jpeg, int orientation, int inSampleSize,
1951c24f5161cfc6a78e45da5f564626d06f6278f7cWu-cheng Li            Uri uri) {
1968ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        // Create the thumbnail.
1978ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        BitmapFactory.Options options = new BitmapFactory.Options();
1981c24f5161cfc6a78e45da5f564626d06f6278f7cWu-cheng Li        options.inSampleSize = inSampleSize;
1998ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        Bitmap bitmap = BitmapFactory.decodeByteArray(jpeg, 0, jpeg.length, options);
200423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync        return createThumbnail(uri, bitmap, orientation);
201423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync    }
202423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync
203423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync    private static Thumbnail createThumbnail(Uri uri, Bitmap bitmap, int orientation) {
2048ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        if (bitmap == null) {
205423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync            Log.e(TAG, "Failed to create thumbnail from null bitmap");
206423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync            return null;
207423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync        }
208423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync        try {
209423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync            return new Thumbnail(uri, bitmap, orientation);
210423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync        } catch (IllegalArgumentException e) {
211423a0a07d4dceea081c6f28acdbbcdbce4fe5785repo sync            Log.e(TAG, "Failed to construct thumbnail", e);
2128ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li            return null;
2138ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li        }
2148ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li    }
2158ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li}
216