From a37e99ce394253c96bc68a5adfce073b4335233d Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Tue, 14 Sep 2021 19:50:50 +0200 Subject: [PATCH] Prevent OOM on scanning large images for barcode --- CHANGELOG.md | 1 + app/src/main/java/protect/card_locker/Utils.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0e0beb8a..d23ae6c06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Unreleased - 83 - Support for changing the sorting order +- Prevent Out Of Memory on scanning large pictures for barcode ## v2.5.0 - 82 (2021-09-10) diff --git a/app/src/main/java/protect/card_locker/Utils.java b/app/src/main/java/protect/card_locker/Utils.java index 25f21575d..fe8fb8bf5 100644 --- a/app/src/main/java/protect/card_locker/Utils.java +++ b/app/src/main/java/protect/card_locker/Utils.java @@ -146,6 +146,21 @@ public class Utils { } static public BarcodeValues getBarcodeFromBitmap(Bitmap bitmap) { + // This function is vulnerable to OOM, so we try again with a smaller bitmap is we get OOM + for (int i = 0; i < 10; i++) { + try { + return Utils.getBarcodeFromBitmapReal(bitmap); + } catch (OutOfMemoryError e) { + Log.w(TAG, "Ran OOM in getBarcodeFromBitmap! Trying again with smaller picture! Retry " + i + " of 10."); + bitmap = Bitmap.createScaledBitmap(bitmap, (int) Math.round(0.75 * bitmap.getWidth()), (int) Math.round(0.75 * bitmap.getHeight()), false); + } + } + + // Give up + return new BarcodeValues(null, null); + } + + static private BarcodeValues getBarcodeFromBitmapReal(Bitmap bitmap) { // In order to decode it, the Bitmap must first be converted into a pixel array... int[] intArray = new int[bitmap.getWidth() * bitmap.getHeight()]; bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());