Updated Branches: refs/heads/master 1f46240ba -> eb0348d47
CB-1014: Out of Memory error when getting image from photo library Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/commit/eb0348d4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/tree/eb0348d4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/diff/eb0348d4 Branch: refs/heads/master Commit: eb0348d47c9f3d2be7230f37ea174df381a82b91 Parents: 1f46240 Author: macdonst <[email protected]> Authored: Fri Jul 6 12:37:08 2012 -0400 Committer: macdonst <[email protected]> Committed: Fri Jul 6 12:37:08 2012 -0400 ---------------------------------------------------------------------- .../src/org/apache/cordova/CameraLauncher.java | 122 ++++++++------- 1 files changed, 64 insertions(+), 58 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/eb0348d4/framework/src/org/apache/cordova/CameraLauncher.java ---------------------------------------------------------------------- diff --git a/framework/src/org/apache/cordova/CameraLauncher.java b/framework/src/org/apache/cordova/CameraLauncher.java index fa19ca3..a85c97b 100755 --- a/framework/src/org/apache/cordova/CameraLauncher.java +++ b/framework/src/org/apache/cordova/CameraLauncher.java @@ -370,75 +370,81 @@ public class CameraLauncher extends Plugin implements MediaScannerConnectionClie this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId); } else { - - // Get the path to the image. Makes loading so much easier. - String imagePath = FileUtils.getRealPathFromURI(uri, this.cordova); - Bitmap bitmap = getScaledBitmap(imagePath); - - if (this.correctOrientation) { - String[] cols = { MediaStore.Images.Media.ORIENTATION }; - Cursor cursor = this.cordova.getActivity().getContentResolver().query(intent.getData(), - cols, null, null, null); - if (cursor != null) { - cursor.moveToPosition(0); - rotate = cursor.getInt(0); - cursor.close(); - } - if (rotate != 0) { - Matrix matrix = new Matrix(); - matrix.setRotate(rotate); - bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); + // This is a special case to just return the path as no scaling, + // rotating or compression needs to be done + if (this.targetHeight == -1 && this.targetWidth == -1 && + this.mQuality == 100 && destType == FILE_URI && !this.correctOrientation) { + this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId); + } else { + // Get the path to the image. Makes loading so much easier. + String imagePath = FileUtils.getRealPathFromURI(uri, this.cordova); + Bitmap bitmap = getScaledBitmap(imagePath); + + if (this.correctOrientation) { + String[] cols = { MediaStore.Images.Media.ORIENTATION }; + Cursor cursor = this.cordova.getActivity().getContentResolver().query(intent.getData(), + cols, null, null, null); + if (cursor != null) { + cursor.moveToPosition(0); + rotate = cursor.getInt(0); + cursor.close(); + } + if (rotate != 0) { + Matrix matrix = new Matrix(); + matrix.setRotate(rotate); + bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); + } } - } - // If sending base64 image back - if (destType == DATA_URL) { - this.processPicture(bitmap); - } + // If sending base64 image back + if (destType == DATA_URL) { + this.processPicture(bitmap); + } - // If sending filename back - else if (destType == FILE_URI) { - // Do we need to scale the returned file - if (this.targetHeight > 0 && this.targetWidth > 0) { - try { - // Create an ExifHelper to save the exif data that is lost during compression - String resizePath = DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()) + "/resize.jpg"; - ExifHelper exif = new ExifHelper(); + // If sending filename back + else if (destType == FILE_URI) { + // Do we need to scale the returned file + if (this.targetHeight > 0 && this.targetWidth > 0) { try { - if (this.encodingType == JPEG) { - exif.createInFile(resizePath); - exif.readExifData(); - rotate = exif.getOrientation(); + // Create an ExifHelper to save the exif data that is lost during compression + String resizePath = DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()) + "/resize.jpg"; + ExifHelper exif = new ExifHelper(); + try { + if (this.encodingType == JPEG) { + exif.createInFile(resizePath); + exif.readExifData(); + rotate = exif.getOrientation(); + } + } catch (IOException e) { + e.printStackTrace(); } - } catch (IOException e) { - e.printStackTrace(); - } - OutputStream os = new FileOutputStream(resizePath); - bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os); - os.close(); + OutputStream os = new FileOutputStream(resizePath); + bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os); + os.close(); - // Restore exif data to file - if (this.encodingType == JPEG) { - exif.createOutFile(FileUtils.getRealPathFromURI(uri, this.cordova)); - exif.writeExifData(); - } + // Restore exif data to file + if (this.encodingType == JPEG) { + exif.createOutFile(FileUtils.getRealPathFromURI(uri, this.cordova)); + exif.writeExifData(); + } - // The resized image is cached by the app in order to get around this and not have to delete you - // application cache I'm adding the current system time to the end of the file url. - this.success(new PluginResult(PluginResult.Status.OK, ("file://" + resizePath + "?" + System.currentTimeMillis())), this.callbackId); - } catch (Exception e) { - e.printStackTrace(); - this.failPicture("Error retrieving image."); + // The resized image is cached by the app in order to get around this and not have to delete you + // application cache I'm adding the current system time to the end of the file url. + this.success(new PluginResult(PluginResult.Status.OK, ("file://" + resizePath + "?" + System.currentTimeMillis())), this.callbackId); + } catch (Exception e) { + e.printStackTrace(); + this.failPicture("Error retrieving image."); + } + } + else { + this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId); } } - else { - this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId); - } + bitmap.recycle(); + bitmap = null; + System.gc(); } - bitmap.recycle(); - bitmap = null; - System.gc(); } } else if (resultCode == Activity.RESULT_CANCELED) {
