From 19fe57408b53d871dc1e306f50b452fdcc8b4737 Mon Sep 17 00:00:00 2001 From: Samuel Mira Date: Mon, 4 Apr 2022 18:30:59 +0300 Subject: Fix usage of unsupported Exif constructor on Android 6 QtCameraListener used ExifInterface(InputStream stream) constructor that was added in API 24 while the mininum support is Android 6 API 23. The fix consists in using ExifInterface(String filename) constructor present since API 5. To use that constructor, it is necessary to save the data to a temporary file for ExifInterface to use. Fixes: QTBUG-99228 Change-Id: Ib39e8da696c64c20e4afcd3f71dd0e7abdea5ee6 Reviewed-by: Lars Knoll (cherry picked from commit 6ccb976f4f9693ad7c6881a186fd6af0f05ff023) Reviewed-by: Qt Cherry-pick Bot --- .../qt/android/multimedia/QtCameraListener.java | 16 ++++++++++++---- .../qt/android/multimedia/QtMultimediaUtils.java | 2 ++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/android/jar/src/org/qtproject/qt/android/multimedia/QtCameraListener.java b/src/android/jar/src/org/qtproject/qt/android/multimedia/QtCameraListener.java index a37544916..7f5361e77 100644 --- a/src/android/jar/src/org/qtproject/qt/android/multimedia/QtCameraListener.java +++ b/src/android/jar/src/org/qtproject/qt/android/multimedia/QtCameraListener.java @@ -45,11 +45,11 @@ import android.hardware.Camera.CameraInfo; import android.graphics.ImageFormat; import android.graphics.SurfaceTexture; import android.util.Log; +import java.io.File; +import java.io.FileOutputStream; import java.lang.Math; import android.media.ExifInterface; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.InputStream; import java.lang.String; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -208,11 +208,16 @@ public class QtCameraListener implements Camera.ShutterCallback, @Override public void onPictureTaken(byte[] data, Camera camera) { + File outputFile = null; try { - InputStream stream = new ByteArrayInputStream(data); + outputFile = File.createTempFile("pic_", ".jpg", QtMultimediaUtils.getCacheDirectory()); + FileOutputStream out = new FileOutputStream(outputFile); - ExifInterface exif = new ExifInterface(stream); + // we just want to read the exif... + BitmapFactory.decodeByteArray(data, 0, data.length) + .compress(Bitmap.CompressFormat.JPEG, 10, out); + ExifInterface exif = new ExifInterface(outputFile.getAbsolutePath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); @@ -260,6 +265,9 @@ public class QtCameraListener implements Camera.ShutterCallback, } catch (Exception e) { Log.w(TAG, "Error fixing bitmap orientation."); e.printStackTrace(); + } finally { + if (outputFile != null && outputFile.exists()) + outputFile.delete(); } notifyPictureCaptured(m_cameraId, data); diff --git a/src/android/jar/src/org/qtproject/qt/android/multimedia/QtMultimediaUtils.java b/src/android/jar/src/org/qtproject/qt/android/multimedia/QtMultimediaUtils.java index 68f63067e..d5f205fe6 100644 --- a/src/android/jar/src/org/qtproject/qt/android/multimedia/QtMultimediaUtils.java +++ b/src/android/jar/src/org/qtproject/qt/android/multimedia/QtMultimediaUtils.java @@ -138,6 +138,8 @@ public class QtMultimediaUtils MediaScannerConnection.scanFile(m_context, new String[] { file }, null, null); } + static File getCacheDirectory() { return m_context.getCacheDir(); } + /* The array of codecs is in the form: c2.qti.vp9.decoder -- cgit v1.2.3