This commit is contained in:
Joe Bowser 2013-04-17 13:37:48 -07:00
commit d3b7903af8
3 changed files with 40 additions and 42 deletions

View File

@ -42,6 +42,7 @@ import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Matrix; import android.graphics.Matrix;
import android.graphics.Bitmap.CompressFormat; import android.graphics.Bitmap.CompressFormat;
import android.graphics.Rect;
import android.media.MediaScannerConnection; import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.MediaScannerConnectionClient; import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.net.Uri; import android.net.Uri;
@ -396,19 +397,21 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
(destType == FILE_URI || destType == NATIVE_URI) && !this.correctOrientation) { (destType == FILE_URI || destType == NATIVE_URI) && !this.correctOrientation) {
this.callbackContext.success(uri.toString()); this.callbackContext.success(uri.toString());
} else { } else {
String uriString = uri.toString();
// Get the path to the image. Makes loading so much easier. // Get the path to the image. Makes loading so much easier.
String imagePath = FileHelper.getRealPath(uri, this.cordova); String mimeType = FileHelper.getMimeType(uriString, this.cordova);
String mimeType = FileHelper.getMimeType(imagePath, this.cordova);
// Log.d(LOG_TAG, "Real path = " + imagePath);
// Log.d(LOG_TAG, "mime type = " + mimeType);
// If we don't have a valid image so quit. // If we don't have a valid image so quit.
if (imagePath == null || mimeType == null || if (!("image/jpeg".equalsIgnoreCase(mimeType) || "image/png".equalsIgnoreCase(mimeType))) {
!(mimeType.equalsIgnoreCase("image/jpeg") || mimeType.equalsIgnoreCase("image/png"))) {
Log.d(LOG_TAG, "I either have a null image path or bitmap"); Log.d(LOG_TAG, "I either have a null image path or bitmap");
this.failPicture("Unable to retrieve path to picture!"); this.failPicture("Unable to retrieve path to picture!");
return; return;
} }
Bitmap bitmap = getScaledBitmap(imagePath); Bitmap bitmap = null;
try {
bitmap = getScaledBitmap(uriString);
} catch (IOException e) {
e.printStackTrace();
}
if (bitmap == null) { if (bitmap == null) {
Log.d(LOG_TAG, "I either have a null image path or bitmap"); Log.d(LOG_TAG, "I either have a null image path or bitmap");
this.failPicture("Unable to create bitmap!"); this.failPicture("Unable to create bitmap!");
@ -417,7 +420,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
if (this.correctOrientation) { if (this.correctOrientation) {
String[] cols = { MediaStore.Images.Media.ORIENTATION }; String[] cols = { MediaStore.Images.Media.ORIENTATION };
Cursor cursor = this.cordova.getActivity().getContentResolver().query(intent.getData(), Cursor cursor = this.cordova.getActivity().getContentResolver().query(uri,
cols, null, null, null); cols, null, null, null);
if (cursor != null) { if (cursor != null) {
cursor.moveToPosition(0); cursor.moveToPosition(0);
@ -563,17 +566,18 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
* *
* @param imagePath * @param imagePath
* @return * @return
* @throws IOException
*/ */
private Bitmap getScaledBitmap(String imagePath) { private Bitmap getScaledBitmap(String imageUrl) throws IOException {
// If no new width or height were specified return the original bitmap // If no new width or height were specified return the original bitmap
if (this.targetWidth <= 0 && this.targetHeight <= 0) { if (this.targetWidth <= 0 && this.targetHeight <= 0) {
return BitmapFactory.decodeFile(imagePath); return BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova));
} }
// figure out the original width and height of the image // figure out the original width and height of the image
BitmapFactory.Options options = new BitmapFactory.Options(); BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imagePath, options); BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova), null, options);
//CB-2292: WTF? Why is the width null? //CB-2292: WTF? Why is the width null?
if(options.outWidth == 0 || options.outHeight == 0) if(options.outWidth == 0 || options.outHeight == 0)
@ -587,7 +591,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
// Load in the smallest bitmap possible that is closest to the size we want // Load in the smallest bitmap possible that is closest to the size we want
options.inJustDecodeBounds = false; options.inJustDecodeBounds = false;
options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, this.targetWidth, this.targetHeight); options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, this.targetWidth, this.targetHeight);
Bitmap unscaledBitmap = BitmapFactory.decodeFile(imagePath, options); Bitmap unscaledBitmap = BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova), null, options);
if (unscaledBitmap == null) { if (unscaledBitmap == null) {
return null; return null;
} }

View File

@ -28,6 +28,8 @@ import org.apache.cordova.api.LOG;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URLConnection;
import java.util.Locale;
public class FileHelper { public class FileHelper {
private static final String LOG_TAG = "FileUtils"; private static final String LOG_TAG = "FileUtils";
@ -92,7 +94,8 @@ public class FileHelper {
Uri uri = Uri.parse(uriString); Uri uri = Uri.parse(uriString);
return cordova.getActivity().getContentResolver().openInputStream(uri); return cordova.getActivity().getContentResolver().openInputStream(uri);
} else if (uriString.startsWith("file:///android_asset/")) { } else if (uriString.startsWith("file:///android_asset/")) {
String relativePath = uriString.substring(22); Uri uri = Uri.parse(uriString);
String relativePath = uri.getPath().substring(15);
return cordova.getActivity().getAssets().open(relativePath); return cordova.getActivity().getAssets().open(relativePath);
} else { } else {
return new FileInputStream(getRealPath(uriString, cordova)); return new FileInputStream(getRealPath(uriString, cordova));
@ -122,14 +125,18 @@ public class FileHelper {
public static String getMimeType(String uriString, CordovaInterface cordova) { public static String getMimeType(String uriString, CordovaInterface cordova) {
String mimeType = null; String mimeType = null;
Uri uri = Uri.parse(uriString);
if (uriString.startsWith("content://")) { if (uriString.startsWith("content://")) {
Uri uri = Uri.parse(uriString);
mimeType = cordova.getActivity().getContentResolver().getType(uri); mimeType = cordova.getActivity().getContentResolver().getType(uri);
} else { } else {
// MimeTypeMap.getFileExtensionFromUrl has a bug that occurs when the filename has a space, so we encode it. // MimeTypeMap.getFileExtensionFromUrl() fails when there are query parameters.
// We also convert the URI string to lower case to ensure compatibility with MimeTypeMap (see CB-2185). String extension = uri.getPath();
String encodedUriString = uriString.replace(" ", "%20").toLowerCase(); int lastDot = extension.lastIndexOf('.');
String extension = MimeTypeMap.getFileExtensionFromUrl(encodedUriString); if (lastDot != -1) {
extension = extension.substring(lastDot + 1);
}
// Convert the URI string to lower case to ensure compatibility with MimeTypeMap (see CB-2185).
extension = extension.toLowerCase();
if (extension.equals("3ga")) { if (extension.equals("3ga")) {
mimeType = "audio/3gpp"; mimeType = "audio/3gpp";
} else { } else {

View File

@ -24,11 +24,12 @@ import java.io.InputStream;
import org.apache.cordova.api.CordovaInterface; import org.apache.cordova.api.CordovaInterface;
import org.apache.cordova.api.LOG; import org.apache.cordova.api.LOG;
import android.content.res.AssetManager; import android.annotation.TargetApi;
import android.net.Uri; import android.os.Build;
import android.webkit.WebResourceResponse; import android.webkit.WebResourceResponse;
import android.webkit.WebView; import android.webkit.WebView;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class IceCreamCordovaWebViewClient extends CordovaWebViewClient { public class IceCreamCordovaWebViewClient extends CordovaWebViewClient {
@ -43,34 +44,20 @@ public class IceCreamCordovaWebViewClient extends CordovaWebViewClient {
@Override @Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) { public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
if(url.contains("?") || url.contains("#") || needsIceCreamSpaceInAssetUrlFix(url)){ if(url.contains("?") || url.contains("#") || needsIceCreamSpaceInAssetUrlFix(url)){
return generateWebResourceResponse(url); WebResourceResponse ret = generateWebResourceResponse(url);
} else { if (ret != null) {
return super.shouldInterceptRequest(view, url); return ret;
}
} }
return super.shouldInterceptRequest(view, url);
} }
private WebResourceResponse generateWebResourceResponse(String url) { private WebResourceResponse generateWebResourceResponse(String url) {
final String ANDROID_ASSET = "file:///android_asset/"; if (url.startsWith("file:///android_asset/")) {
if (url.startsWith(ANDROID_ASSET)) { String mimetype = FileHelper.getMimeType(url, cordova);
String niceUrl = url;
niceUrl = url.replaceFirst(ANDROID_ASSET, "");
if(niceUrl.contains("?")){
niceUrl = niceUrl.split("\\?")[0];
}
if(niceUrl.contains("#"))
{
niceUrl = niceUrl.split("#")[0];
}
String mimetype = null;
if(niceUrl.endsWith(".html")){
mimetype = "text/html";
}
try { try {
AssetManager assets = cordova.getActivity().getAssets(); InputStream stream = FileHelper.getInputStreamFromUriString(url, cordova);
Uri uri = Uri.parse(niceUrl);
InputStream stream = assets.open(uri.getPath(), AssetManager.ACCESS_STREAMING);
WebResourceResponse response = new WebResourceResponse(mimetype, "UTF-8", stream); WebResourceResponse response = new WebResourceResponse(mimetype, "UTF-8", stream);
return response; return response;
} catch (IOException e) { } catch (IOException e) {