diff options
Diffstat (limited to 'src/com/android/camera/ImageManager.java')
-rwxr-xr-x | src/com/android/camera/ImageManager.java | 128 |
1 files changed, 77 insertions, 51 deletions
diff --git a/src/com/android/camera/ImageManager.java b/src/com/android/camera/ImageManager.java index 4354e92..b21b243 100755 --- a/src/com/android/camera/ImageManager.java +++ b/src/com/android/camera/ImageManager.java @@ -63,7 +63,7 @@ import java.util.HashMap; */ public class ImageManager { public static final String CAMERA_IMAGE_BUCKET_NAME = - Environment.getExternalStorageDirectory().toString() + "/dcim/Camera"; + Environment.getExternalStorageDirectory().toString() + "/DCIM/Camera"; public static final String CAMERA_IMAGE_BUCKET_ID = getBucketId(CAMERA_IMAGE_BUCKET_NAME); /** @@ -830,7 +830,7 @@ public class ImageManager { } String randomAccessFilePath(int version) { - String directoryName = Environment.getExternalStorageDirectory().toString() + "/dcim/.thumbnails"; + String directoryName = Environment.getExternalStorageDirectory().toString() + "/DCIM/.thumbnails"; String path = directoryName + "/.thumbdata" + version + "-" + mUri.hashCode(); return path; } @@ -1035,25 +1035,6 @@ public class ImageManager { return bitmap; } - private Bitmap createVideoThumbnail(String filePath) { - Bitmap bitmap = null; - MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - try { - retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY); - retriever.setDataSource(filePath); - bitmap = retriever.captureFrame(); - } catch (RuntimeException ex) { - // Assume this is a corrupt video file. - } finally { - try { - retriever.release(); - } catch (RuntimeException ex) { - // Ignore failures while cleaning up. - } - } - return bitmap; - } - // returns id public long checkThumbnail(BaseImage existingImage, Cursor c, int i) { long magic, fileMagic = 0, id; @@ -1114,13 +1095,13 @@ public class ImageManager { } } if (filePath != null) { - bitmap = createThumbnailFromEXIF(filePath, id); - if (bitmap == null) { - String mimeType = c.getString(indexMimeType()); - boolean isVideo = isVideoMimeType(mimeType); - if (isVideo) { - bitmap = createVideoThumbnail(filePath); - } else { + String mimeType = c.getString(indexMimeType()); + boolean isVideo = isVideoMimeType(mimeType); + if (isVideo) { + bitmap = createVideoThumbnail(filePath); + } else { + bitmap = createThumbnailFromEXIF(filePath, id); + if (bitmap == null) { bitmap = createThumbnailFromUri(c, id); } } @@ -1166,13 +1147,13 @@ public class ImageManager { } } - public void checkThumbnails(ThumbCheckCallback cb) { + public void checkThumbnails(ThumbCheckCallback cb, int totalThumbnails) { Cursor c = Images.Media.query( mContentResolver, mBaseUri, new String[] { "_id", "mini_thumb_magic" }, - "mini_thumb_magic isnull and " + sWhereClause, - sAcceptableImageTypes, + thumbnailWhereClause(), + thumbnailWhereClauseArgs(), "_id ASC"); int count = c.getCount(); @@ -1201,7 +1182,6 @@ public class ImageManager { c = getCursor(); try { if (VERBOSE) Log.v(TAG, "checkThumbnails found " + c.getCount()); - int max = c.getCount(); int current = 0; for (int i = 0; i < c.getCount(); i++) { try { @@ -1211,7 +1191,7 @@ public class ImageManager { break; } if (cb != null) { - if (!cb.checking(current, max)) { + if (!cb.checking(current, totalThumbnails)) { if (VERBOSE) Log.v(TAG, "got false from checking... break <<<<<<<<<<<<<<<<<<<<<<<<"); break; } @@ -1228,6 +1208,14 @@ public class ImageManager { } } + protected String thumbnailWhereClause() { + return sMiniThumbIsNull + " and " + sWhereClause; + } + + protected String[] thumbnailWhereClauseArgs() { + return sAcceptableImageTypes; + } + public void commitChanges() { synchronized (mCursor) { mCursor.commitUpdates(); @@ -1696,7 +1684,7 @@ public class ImageManager { public boolean checking(int current, int count); } - public abstract void checkThumbnails(ThumbCheckCallback cb); + public abstract void checkThumbnails(ThumbCheckCallback cb, int totalCount); public abstract void commitChanges(); @@ -2085,6 +2073,7 @@ public class ImageManager { final static private String sWhereClause = "(" + Images.Media.MIME_TYPE + "=? or " + Images.Media.MIME_TYPE + "=?" + ")"; final static private String[] sAcceptableImageTypes = new String[] { "image/jpeg", "image/png" }; + final static private String sMiniThumbIsNull = "mini_thumb_magic isnull"; private static final String[] IMAGE_PROJECTION = new String[] { "_id", @@ -2362,7 +2351,7 @@ public class ImageManager { } @Override - public void checkThumbnails(ThumbCheckCallback cb) { + public void checkThumbnails(ThumbCheckCallback cb, int totalCount) { // do nothing } @@ -2465,13 +2454,12 @@ public class ImageManager { } } - public void checkThumbnails(ThumbCheckCallback cb) { - // TODO this isn't quite right because we need to get the - // total from each sub item and provide that in the callback - final IImageList sublist[] = mSubList; - final int length = sublist.length; - for (int i = 0; i < length; i++) - sublist[i].checkThumbnails(cb); + public void checkThumbnails(ThumbCheckCallback cb, int totalThumbnails) { + for (IImageList i : mSubList) { + int count = i.getCount(); + i.checkThumbnails(cb, totalThumbnails); + totalThumbnails -= count; + } } public void commitChanges() { @@ -3284,7 +3272,6 @@ public class ImageManager { HashMap<String, String> hash = new HashMap<String, String>(); if (c != null && c.moveToFirst()) { do { - Log.e(TAG, "id: " + c.getString(1) + " display_name: " + c.getString(0)); hash.put(c.getString(1), c.getString(0)); } while (c.moveToNext()); } @@ -3303,6 +3290,16 @@ public class ImageManager { return null; } + @Override + protected String thumbnailWhereClause() { + return sMiniThumbIsNull; + } + + @Override + protected String[] thumbnailWhereClauseArgs() { + return null; + } + protected Cursor createCursor() { Cursor c = Images.Media.query( @@ -3366,13 +3363,14 @@ public class ImageManager { return thumbnail; } - private final Bitmap sDefaultThumbnail = Bitmap.createBitmap(32, 32, Bitmap.Config.RGB_565); private String sortOrder() { - return Video.Media.DATE_MODIFIED + (mSort == SORT_ASCENDING ? " ASC " : " DESC"); + return Video.Media.DATE_TAKEN + (mSort == SORT_ASCENDING ? " ASC " : " DESC"); } } + private final static Bitmap sDefaultThumbnail = Bitmap.createBitmap(32, 32, Bitmap.Config.RGB_565); + /** * Represents a particular video and provides access * to the underlying data and two thumbnail bitmaps @@ -3537,10 +3535,10 @@ public class ImageManager { sb.append("" + mId); return sb.toString(); } - - private final Bitmap sNoImageBitmap = Bitmap.createBitmap(128, 128, Bitmap.Config.RGB_565); } + private final static Bitmap sNoImageBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565); + /* * How much quality to use when storing the thumbnail. */ @@ -3900,7 +3898,8 @@ public class ImageManager { public IImageList emptyImageList() { return new IImageList() { - public void checkThumbnails(com.android.camera.ImageManager.IImageList.ThumbCheckCallback cb) { + public void checkThumbnails(ImageManager.IImageList.ThumbCheckCallback cb, + int totalThumbnails) { } public void commitChanges() { @@ -3936,10 +3935,11 @@ public class ImageManager { public void removeImageAt(int i) { } - public void removeOnChangeListener(com.android.camera.ImageManager.IImageList.OnChange changeCallback) { + public void removeOnChangeListener(ImageManager.IImageList.OnChange changeCallback) { } - public void setOnChangeListener(com.android.camera.ImageManager.IImageList.OnChange changeCallback, Handler h) { + public void setOnChangeListener(ImageManager.IImageList.OnChange changeCallback, + Handler h) { } }; @@ -4027,7 +4027,7 @@ public class ImageManager { // Create a temporary file to see whether a volume is really writeable. It's important not to // put it in the root directory which may have a limit on the number of files. static private boolean checkFsWritable() { - String directoryName = Environment.getExternalStorageDirectory().toString() + "/dcim"; + String directoryName = Environment.getExternalStorageDirectory().toString() + "/DCIM"; File directory = new File(directoryName); if (!directory.isDirectory()) { if (!directory.mkdirs()) { @@ -4100,4 +4100,30 @@ public class ImageManager { Log.v(TAG, ">>>>>>>>>>>>>>>>>>>>>>>>> isMediaScannerScanning returning " + result); return result; } + + /** + * Create a video thumbnail for a video. May return null if the video is corrupt. + * @param filePath + * @return + */ + public static Bitmap createVideoThumbnail(String filePath) { + Bitmap bitmap = null; + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + try { + retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY); + retriever.setDataSource(filePath); + bitmap = retriever.captureFrame(); + } catch(IllegalArgumentException ex) { + // Assume this is a corrupt video file + } catch (RuntimeException ex) { + // Assume this is a corrupt video file. + } finally { + try { + retriever.release(); + } catch (RuntimeException ex) { + // Ignore failures while cleaning up. + } + } + return bitmap; + } } |