From e789349c23993d8ac020155fc7ab276716cb6e7c Mon Sep 17 00:00:00 2001 From: macdonst Date: Tue, 19 Jul 2011 03:57:02 +0800 Subject: [PATCH] Handle content:// uri's in resolveLocalFileSystemURI Sometimes Android will hand you a content:// uri in the place of a file path. Particularily the Camera.getPicture() code will do this. I've updated the file utils code to handle this type of uri and return a real file path. --- framework/src/com/phonegap/Capture.java | 8 ++++- framework/src/com/phonegap/FileUtils.java | 44 +++++++++++++++-------- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/framework/src/com/phonegap/Capture.java b/framework/src/com/phonegap/Capture.java index 25ed6460..b078e5df 100644 --- a/framework/src/com/phonegap/Capture.java +++ b/framework/src/com/phonegap/Capture.java @@ -95,7 +95,13 @@ public class Capture extends Plugin { obj.put("duration", 0); obj.put("codecs", ""); - if (mimeType.equals("image/jpeg")) { + // If the mimeType isn't set the rest will fail + // so let's see if we can determine it. + if (mimeType == null || mimeType.equals("")) { + mimeType = FileUtils.getMimeType(filePath); + } + + if (mimeType.equals("image/jpeg") || filePath.endsWith(".jpg")) { obj = getImageData(filePath, obj); } else if (filePath.endsWith("audio/3gpp")) { diff --git a/framework/src/com/phonegap/FileUtils.java b/framework/src/com/phonegap/FileUtils.java index c707f293..240a507e 100755 --- a/framework/src/com/phonegap/FileUtils.java +++ b/framework/src/com/phonegap/FileUtils.java @@ -18,8 +18,10 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import android.database.Cursor; import android.net.Uri; import android.os.Environment; +import android.provider.MediaStore; import android.util.Log; import android.webkit.MimeTypeMap; @@ -228,22 +230,34 @@ public class FileUtils extends Plugin { */ private JSONObject resolveLocalFileSystemURI(String url) throws IOException, JSONException { String decoded = URLDecoder.decode(url, "UTF-8"); - // Test to see if this is a valid URL first - @SuppressWarnings("unused") - URL testUrl = new URL(decoded); + + File fp = null; + + // Handle the special case where you get an Android content:// uri. + if (decoded.startsWith("content:")) { + Cursor cursor = this.ctx.managedQuery(Uri.parse(decoded), new String[] { MediaStore.Images.Media.DATA }, null, null, null); + // Note: MediaStore.Images/Audio/Video.Media.DATA is always "_data" + int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); + cursor.moveToFirst(); + fp = new File(cursor.getString(column_index)); + } else { + // Test to see if this is a valid URL first + @SuppressWarnings("unused") + URL testUrl = new URL(decoded); + + if (decoded.startsWith("file://")) { + fp = new File(decoded.substring(7, decoded.length())); + } else { + fp = new File(decoded); + } + } - File fp = null; - if (decoded.startsWith("file://")) { - fp = new File(decoded.substring(7, decoded.length())); - } else { - fp = new File(decoded); - } - if (!fp.exists()) { - throw new FileNotFoundException(); - } - if (!fp.canRead()) { - throw new IOException(); - } + if (!fp.exists()) { + throw new FileNotFoundException(); + } + if (!fp.canRead()) { + throw new IOException(); + } return getEntry(fp); }