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