diff options
author | Owen Lin <owenlin@google.com> | 2012-04-20 18:42:22 +0800 |
---|---|---|
committer | Owen Lin <owenlin@google.com> | 2012-04-25 15:27:42 +0800 |
commit | 56363ddedc94981a0745065d792603bbf7d23878 (patch) | |
tree | 4faee2c40a139c709434950af028cb3b1554319c /src/com/android/gallery3d/data/UriSource.java | |
parent | c79766a95de4635145a0426ed822af6c4732a70c (diff) | |
download | android_packages_apps_Snap-56363ddedc94981a0745065d792603bbf7d23878.tar.gz android_packages_apps_Snap-56363ddedc94981a0745065d792603bbf7d23878.tar.bz2 android_packages_apps_Snap-56363ddedc94981a0745065d792603bbf7d23878.zip |
Fix NPE in Gallery.
This happens if user set type in an intent. But we get a different type from
content resolver.
Change-Id: Iabafce7f7aaff23a7a9ee09e1d38ab50049abc88
fix: 6358473
Diffstat (limited to 'src/com/android/gallery3d/data/UriSource.java')
-rw-r--r-- | src/com/android/gallery3d/data/UriSource.java | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/src/com/android/gallery3d/data/UriSource.java b/src/com/android/gallery3d/data/UriSource.java index ac53dd5e0..76f7ac0e5 100644 --- a/src/com/android/gallery3d/data/UriSource.java +++ b/src/com/android/gallery3d/data/UriSource.java @@ -16,7 +16,9 @@ package com.android.gallery3d.data; +import android.content.ContentResolver; import android.net.Uri; +import android.webkit.MimeTypeMap; import com.android.gallery3d.app.GalleryApp; @@ -37,21 +39,35 @@ class UriSource extends MediaSource { @Override public MediaObject createMediaObject(Path path) { String segment[] = path.split(); - if (segment.length != 2) { + if (segment.length != 3) { throw new RuntimeException("bad path: " + path); } - - String decoded = URLDecoder.decode(segment[1]); - return new UriImage(mApplication, path, Uri.parse(decoded)); + String uri = URLDecoder.decode(segment[1]); + String type = URLDecoder.decode(segment[2]); + return new UriImage(mApplication, path, Uri.parse(uri), type); } - @Override - public Path findPathByUri(Uri uri) { - String type = mApplication.getContentResolver().getType(uri); + private String getMimeType(Uri uri) { + if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { + String extension = + MimeTypeMap.getFileExtensionFromUrl(uri.toString()); + String type = MimeTypeMap.getSingleton() + .getMimeTypeFromExtension(extension.toLowerCase()); + if (type != null) return type; + } // Assume the type is image if the type cannot be resolved // This could happen for "http" URI. - if (type == null || type.startsWith("image/")) { - return Path.fromString("/uri/" + URLEncoder.encode(uri.toString())); + String type = mApplication.getContentResolver().getType(uri); + if (type == null) type = "image/*"; + return type; + } + + @Override + public Path findPathByUri(Uri uri, String type) { + if (type == null) type = getMimeType(uri); + if (type.startsWith("image/")) { + return Path.fromString("/uri/" + URLEncoder.encode(uri.toString()) + + "/" +URLEncoder.encode(type)); } return null; } |