From 6cd2b1db61a69bbd371a41927150c338b70b88b7 Mon Sep 17 00:00:00 2001 From: mvan Date: Wed, 8 Nov 2023 11:54:10 +0100 Subject: [PATCH 1/3] fix(android): Fixed exif handling when loading picture from gallery --- src/android/CameraLauncher.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/android/CameraLauncher.java b/src/android/CameraLauncher.java index ef730d643..0e76f85e5 100644 --- a/src/android/CameraLauncher.java +++ b/src/android/CameraLauncher.java @@ -778,7 +778,22 @@ private void processResultFromGallery(int destType, Intent intent) { // If sending base64 image back if (destType == DATA_URL) { - this.processPicture(bitmap, this.encodingType); + // To allow keeping the Exif data, we need to save the image to allow ExifInterface add the data + // After that, we load the image and send it as base64 + try { + String modifiedPath = this.outputModifiedBitmap(bitmap, uri, mimeTypeOfGalleryFile); + InputStream fileStream = FileHelper.getInputStreamFromUriString(modifiedPath, cordova); + byte[] file = new byte[fileStream.available()]; + + fileStream.read(file); + + byte[] output = Base64.encode(file, Base64.NO_WRAP); + String js_out = new String(output); + this.callbackContext.success(js_out); + } catch (IOException e) { + e.printStackTrace(); + this.failPicture("Error retrieving image: "+e.getLocalizedMessage()); + } } // If sending filename back From 0da946d77068c86294c8e5706fbb83d98aa3a7cf Mon Sep 17 00:00:00 2001 From: mvan Date: Fri, 10 Nov 2023 10:42:15 +0100 Subject: [PATCH 2/3] fix(android): Fixed unsafe reading of temporary file --- src/android/CameraLauncher.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/android/CameraLauncher.java b/src/android/CameraLauncher.java index 0e76f85e5..af16b8a3f 100644 --- a/src/android/CameraLauncher.java +++ b/src/android/CameraLauncher.java @@ -783,9 +783,17 @@ private void processResultFromGallery(int destType, Intent intent) { try { String modifiedPath = this.outputModifiedBitmap(bitmap, uri, mimeTypeOfGalleryFile); InputStream fileStream = FileHelper.getInputStreamFromUriString(modifiedPath, cordova); - byte[] file = new byte[fileStream.available()]; + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - fileStream.read(file); + int nRead; + byte[] data = new byte[512]; + + while ((nRead = fileStream.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + } + + buffer.flush(); + byte[] file = buffer.toByteArray(); byte[] output = Base64.encode(file, Base64.NO_WRAP); String js_out = new String(output); From a5142f1e373e284d9077ba4d53eedec99619e7f0 Mon Sep 17 00:00:00 2001 From: mvan Date: Mon, 13 Nov 2023 11:33:13 +0100 Subject: [PATCH 3/3] fix(android): Fixed too small buffer while reading temporary file --- src/android/CameraLauncher.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/android/CameraLauncher.java b/src/android/CameraLauncher.java index af16b8a3f..f960ea582 100644 --- a/src/android/CameraLauncher.java +++ b/src/android/CameraLauncher.java @@ -786,7 +786,9 @@ private void processResultFromGallery(int destType, Intent intent) { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); int nRead; - byte[] data = new byte[512]; + final int MB = 1048576; + + byte[] data = new byte[MB * 4]; while ((nRead = fileStream.read(data, 0, data.length)) != -1) { buffer.write(data, 0, nRead);