You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ag...@apache.org on 2015/03/05 02:34:16 UTC
cordova-plugin-camera git commit: CB-8235 android: Fix crash when
selecting images from DropBox with spaces in path (close #65)
Repository: cordova-plugin-camera
Updated Branches:
refs/heads/master f39a08ba2 -> 929733b89
CB-8235 android: Fix crash when selecting images from DropBox with spaces in path (close #65)
Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/commit/929733b8
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/tree/929733b8
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/diff/929733b8
Branch: refs/heads/master
Commit: 929733b8913311f2cfd504937268a8a1d22f4f9a
Parents: f39a08b
Author: Serge Huijben <th...@gmail.com>
Authored: Wed Mar 4 20:33:21 2015 -0500
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Wed Mar 4 20:33:21 2015 -0500
----------------------------------------------------------------------
src/android/FileHelper.java | 131 ++++++++++++++++++++++++++++++---------
1 file changed, 102 insertions(+), 29 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/blob/929733b8/src/android/FileHelper.java
----------------------------------------------------------------------
diff --git a/src/android/FileHelper.java b/src/android/FileHelper.java
index 24ced59..59f890e 100644
--- a/src/android/FileHelper.java
+++ b/src/android/FileHelper.java
@@ -6,9 +6,7 @@
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
-
http://www.apache.org/licenses/LICENSE-2.0
-
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -18,8 +16,14 @@
*/
package org.apache.cordova.camera;
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.CursorLoader;
import android.database.Cursor;
import android.net.Uri;
+import android.os.Build;
+import android.provider.DocumentsContract;
+import android.provider.MediaStore;
import android.webkit.MimeTypeMap;
import org.apache.cordova.CordovaInterface;
@@ -43,27 +47,19 @@ public class FileHelper {
* @return the full path to the file
*/
@SuppressWarnings("deprecation")
- public static String getRealPath(String uriString, CordovaInterface cordova) {
+ public static String getRealPath(Uri uri, CordovaInterface cordova) {
String realPath = null;
- if (uriString.startsWith("content://")) {
- String[] proj = { _DATA };
- Cursor cursor = cordova.getActivity().managedQuery(Uri.parse(uriString), proj, null, null, null);
- int column_index = cursor.getColumnIndexOrThrow(_DATA);
- cursor.moveToFirst();
- realPath = cursor.getString(column_index);
- if (realPath == null) {
- LOG.e(LOG_TAG, "Could get real path for URI string %s", uriString);
- }
- } else if (uriString.startsWith("file://")) {
- realPath = uriString.substring(7);
- if (realPath.startsWith("/android_asset/")) {
- LOG.e(LOG_TAG, "Cannot get real path for URI string %s because it is a file:///android_asset/ URI.", uriString);
- realPath = null;
- }
- } else {
- realPath = uriString;
- }
+ if (Build.VERSION.SDK_INT < 11)
+ realPath = FileHelper.getRealPathFromURI_BelowAPI11(cordova.getActivity(), uri);
+
+ // SDK >= 11 && SDK < 19
+ else if (Build.VERSION.SDK_INT < 19)
+ realPath = FileHelper.getRealPathFromURI_API11to18(cordova.getActivity(), uri);
+
+ // SDK > 19 (Android 4.4)
+ else
+ realPath = FileHelper.getRealPathFromURI_API19(cordova.getActivity(), uri);
return realPath;
}
@@ -76,8 +72,74 @@ public class FileHelper {
* @param cordova the current application context
* @return the full path to the file
*/
- public static String getRealPath(Uri uri, CordovaInterface cordova) {
- return FileHelper.getRealPath(uri.toString(), cordova);
+ public static String getRealPath(String uriString, CordovaInterface cordova) {
+ return FileHelper.getRealPath(Uri.parse(uriString), cordova);
+ }
+
+ @SuppressLint("NewApi")
+ public static String getRealPathFromURI_API19(Context context, Uri uri) {
+ String filePath = "";
+ try {
+ String wholeID = DocumentsContract.getDocumentId(uri);
+
+ // Split at colon, use second item in the array
+ String id = wholeID.indexOf(":") > -1 ? wholeID.split(":")[1] : wholeID.indexOf(";") > -1 ? wholeID
+ .split(";")[1] : wholeID;
+
+ String[] column = { MediaStore.Images.Media.DATA };
+
+ // where id is equal to
+ String sel = MediaStore.Images.Media._ID + "=?";
+
+ Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column,
+ sel, new String[] { id }, null);
+
+ int columnIndex = cursor.getColumnIndex(column[0]);
+
+ if (cursor.moveToFirst()) {
+ filePath = cursor.getString(columnIndex);
+ }
+ cursor.close();
+ } catch (Exception e) {
+ filePath = "";
+ }
+ return filePath;
+ }
+
+ @SuppressLint("NewApi")
+ public static String getRealPathFromURI_API11to18(Context context, Uri contentUri) {
+ String[] proj = { MediaStore.Images.Media.DATA };
+ String result = null;
+
+ try {
+ CursorLoader cursorLoader = new CursorLoader(context, contentUri, proj, null, null, null);
+ Cursor cursor = cursorLoader.loadInBackground();
+
+ if (cursor != null) {
+ int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
+ cursor.moveToFirst();
+ result = cursor.getString(column_index);
+ }
+ } catch (Exception e) {
+ result = null;
+ }
+ return result;
+ }
+
+ public static String getRealPathFromURI_BelowAPI11(Context context, Uri contentUri) {
+ String[] proj = { MediaStore.Images.Media.DATA };
+ String result = null;
+
+ try {
+ Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
+ int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
+ cursor.moveToFirst();
+ result = cursor.getString(column_index);
+
+ } catch (Exception e) {
+ result = null;
+ }
+ return result;
}
/**
@@ -88,25 +150,36 @@ public class FileHelper {
* @return an input stream into the data at the given URI or null if given an invalid URI string
* @throws IOException
*/
- public static InputStream getInputStreamFromUriString(String uriString, CordovaInterface cordova) throws IOException {
+ public static InputStream getInputStreamFromUriString(String uriString, CordovaInterface cordova)
+ throws IOException {
+ InputStream returnValue = null;
if (uriString.startsWith("content")) {
Uri uri = Uri.parse(uriString);
- return cordova.getActivity().getContentResolver().openInputStream(uri);
+ returnValue = cordova.getActivity().getContentResolver().openInputStream(uri);
} else if (uriString.startsWith("file://")) {
int question = uriString.indexOf("?");
if (question > -1) {
- uriString = uriString.substring(0,question);
+ uriString = uriString.substring(0, question);
}
if (uriString.startsWith("file:///android_asset/")) {
Uri uri = Uri.parse(uriString);
String relativePath = uri.getPath().substring(15);
- return cordova.getActivity().getAssets().open(relativePath);
+ returnValue = cordova.getActivity().getAssets().open(relativePath);
} else {
- return new FileInputStream(getRealPath(uriString, cordova));
+ // might still be content so try that first
+ try {
+ returnValue = cordova.getActivity().getContentResolver().openInputStream(Uri.parse(uriString));
+ } catch (Exception e) {
+ returnValue = null;
+ }
+ if (returnValue == null) {
+ returnValue = new FileInputStream(getRealPath(uriString, cordova));
+ }
}
} else {
- return new FileInputStream(getRealPath(uriString, cordova));
+ returnValue = new FileInputStream(uriString);
}
+ return returnValue;
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org