UriImage.java revision bc2154199aee16762e3758ad0cfed685323d9a9f
1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/* 2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project 3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License. 6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at 7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software 11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and 14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License. 15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.data; 18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.app.GalleryApp; 20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.common.BitmapUtils; 21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.common.Utils; 22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.ThreadPool.CancelListener; 23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.ThreadPool.Job; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.ThreadPool.JobContext; 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.ContentResolver; 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.Bitmap; 28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.Bitmap.Config; 29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.BitmapFactory.Options; 30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.BitmapRegionDecoder; 31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.net.Uri; 32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.os.ParcelFileDescriptor; 33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.webkit.MimeTypeMap; 34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.io.FileNotFoundException; 36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.net.URI; 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.net.URL; 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class UriImage extends MediaItem { 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "UriImage"; 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int STATE_INIT = 0; 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int STATE_DOWNLOADING = 1; 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int STATE_DOWNLOADED = 2; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int STATE_ERROR = -1; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final Uri mUri; 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final String mContentType; 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private DownloadCache.Entry mCacheEntry; 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private ParcelFileDescriptor mFileDescriptor; 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mState = STATE_INIT; 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mWidth; 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mHeight; 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private GalleryApp mApplication; 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public UriImage(GalleryApp application, Path path, Uri uri) { 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super(path, nextVersionNumber()); 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mUri = uri; 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mApplication = Utils.checkNotNull(application); 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentType = getMimeType(uri); 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private String getMimeType(Uri uri) { 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String extension = 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MimeTypeMap.getFileExtensionFromUrl(uri.toString()); 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String type = MimeTypeMap.getSingleton() 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .getMimeTypeFromExtension(extension); 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (type != null) return type; 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mApplication.getContentResolver().getType(uri); 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Job<Bitmap> requestImage(int type) { 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return new BitmapJob(type); 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Job<BitmapRegionDecoder> requestLargeImage() { 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return new RegionDecoderJob(); 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void openFileOrDownloadTempFile(JobContext jc) { 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int state = openOrDownloadInner(jc); 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin synchronized (this) { 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mState = state; 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mState != STATE_DOWNLOADED) { 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mFileDescriptor != null) { 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Utils.closeSilently(mFileDescriptor); 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mFileDescriptor = null; 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin notifyAll(); 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int openOrDownloadInner(JobContext jc) { 101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String scheme = mUri.getScheme(); 102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (ContentResolver.SCHEME_CONTENT.equals(scheme) 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin || ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme) 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin || ContentResolver.SCHEME_FILE.equals(scheme)) { 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mFileDescriptor = mApplication.getContentResolver() 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .openFileDescriptor(mUri, "r"); 108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (jc.isCancelled()) return STATE_INIT; 109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return STATE_DOWNLOADED; 110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (FileNotFoundException e) { 111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.w(TAG, "fail to open: " + mUri, e); 112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return STATE_ERROR; 113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin URL url = new URI(mUri.toString()).toURL(); 117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCacheEntry = mApplication.getDownloadCache().download(jc, url); 118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (jc.isCancelled()) return STATE_INIT; 119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCacheEntry == null) { 120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.w(TAG, "download failed " + url); 121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return STATE_ERROR; 122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mFileDescriptor = ParcelFileDescriptor.open( 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCacheEntry.cacheFile, ParcelFileDescriptor.MODE_READ_ONLY); 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return STATE_DOWNLOADED; 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (Throwable t) { 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.w(TAG, "download error", t); 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return STATE_ERROR; 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean prepareInputFile(JobContext jc) { 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin jc.setCancelListener(new CancelListener() { 135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCancel() { 136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin synchronized (this) { 137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin notifyAll(); 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin while (true) { 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin synchronized (this) { 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (jc.isCancelled()) return false; 145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mState == STATE_INIT) { 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mState = STATE_DOWNLOADING; 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Then leave the synchronized block and continue. 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mState == STATE_ERROR) { 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mState == STATE_DOWNLOADED) { 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else /* if (mState == STATE_DOWNLOADING) */ { 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin wait(); 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (InterruptedException ex) { 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // ignored. 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin continue; 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // This is only reached for STATE_INIT->STATE_DOWNLOADING 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin openFileOrDownloadTempFile(jc); 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class RegionDecoderJob implements Job<BitmapRegionDecoder> { 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public BitmapRegionDecoder run(JobContext jc) { 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!prepareInputFile(jc)) return null; 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin BitmapRegionDecoder decoder = DecodeUtils.requestCreateBitmapRegionDecoder( 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin jc, mFileDescriptor.getFileDescriptor(), false); 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mWidth = decoder.getWidth(); 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHeight = decoder.getHeight(); 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return decoder; 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class BitmapJob implements Job<Bitmap> { 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mType; 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected BitmapJob(int type) { 181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mType = type; 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Bitmap run(JobContext jc) { 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!prepareInputFile(jc)) return null; 186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int targetSize = LocalImage.getTargetSize(mType); 187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Options options = new Options(); 188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin options.inPreferredConfig = Config.ARGB_8888; 189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bitmap bitmap = DecodeUtils.requestDecode(jc, 190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mFileDescriptor.getFileDescriptor(), options, targetSize); 191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (jc.isCancelled() || bitmap == null) { 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return null; 193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mType == MediaItem.TYPE_MICROTHUMBNAIL) { 196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin bitmap = BitmapUtils.resizeDownAndCropCenter(bitmap, 197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin targetSize, true); 198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin bitmap = BitmapUtils.resizeDownBySideLength(bitmap, 200f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin targetSize, true); 201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return bitmap; 204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getSupportedOperations() { 209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int supported = SUPPORT_EDIT | SUPPORT_SETAS; 210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (isSharable()) supported |= SUPPORT_SHARE; 211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (BitmapUtils.isSupportedByRegionDecoder(mContentType)) { 212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin supported |= SUPPORT_FULL_IMAGE; 213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return supported; 215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean isSharable() { 218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // We cannot grant read permission to the receiver since we put 219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // the data URI in EXTRA_STREAM instead of the data part of an intent 220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // And there are issues in MediaUploader and Bluetooth file sender to 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // share a general image data. So, we only share for local file. 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return ContentResolver.SCHEME_FILE.equals(mUri.getScheme()); 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getMediaType() { 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return MEDIA_TYPE_IMAGE; 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Uri getContentUri() { 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mUri; 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaDetails details = super.getDetails(); 238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mWidth != 0 && mHeight != 0) { 239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin details.addDetail(MediaDetails.INDEX_WIDTH, mWidth); 240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin details.addDetail(MediaDetails.INDEX_HEIGHT, mHeight); 241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin details.addDetail(MediaDetails.INDEX_MIMETYPE, mContentType); 243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (ContentResolver.SCHEME_FILE.equals(mUri.getScheme())) { 244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String filePath = mUri.getPath(); 245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin details.addDetail(MediaDetails.INDEX_PATH, filePath); 246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaDetails.extractExifInfo(details, filePath); 247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return details; 249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public String getMimeType() { 253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mContentType; 254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void finalize() throws Throwable { 258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 259f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mFileDescriptor != null) { 260f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Utils.closeSilently(mFileDescriptor); 261f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 262f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } finally { 263f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.finalize(); 264f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 265f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 266bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 267bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang @Override 268bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang public int getWidth() { 269bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang return 0; 270bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 271bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 272bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang @Override 273bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang public int getHeight() { 274bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang return 0; 275bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 276f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 277