OutOfMemoryError при сжатии изображения - PullRequest
0 голосов
/ 19 февраля 2020

Я работаю над приложением, которое в определенный момент должно сжать изображение, чтобы отправить его на сервер. Если сжатие не работает, он отправляет несжатую фотографию (не имеет значения).

Несмотря на то, что метод сжатия окружен методом try-catch, он иногда выдает ошибку OutOfMemory на нескольких устройствах, и я хочу избежать этого.

Это метод:

fun compressCapture(
    capture: File
): ByteArray? {
    return try {
        val compression = FirebaseRemoteConfig.getInstance().getLong(Constants.PICTURE_QUALITY)
        val pictureBytes = capture.readBytes()
        val bitmap = BitmapFactory.decodeByteArray(pictureBytes, 0, pictureBytes.size)
        val outputStream = ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.JPEG, compression.toInt(), outputStream)
        outputStream.toByteArray()
    } catch (e: Exception) {
        if (!BuildConfig.DEBUG)
            Crashlytics.logException(e)
        null
    }
}

Если возвращается ноль, приложение отправляет несжатый файл

Трассировка стека, которой я являюсь иногда в Firebase получают:

Fatal Exception: java.lang.OutOfMemoryError: Failed to allocate a 1735832 byte allocation with 1549160 free bytes and 1512KB until OOM
       at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:122)
       at com.sagacollect.utils.FileUtils.compressCapture(FileUtils.java:9)

В противном случае это:

Fatal Exception: java.lang.OutOfMemoryError: Failed to allocate a 51916812 byte allocation with 16777216 free bytes and 45MB until OOM
       at dalvik.system.VMRuntime.newNonMovableArray(VMRuntime.java)
       at android.graphics.BitmapFactory.nativeDecodeByteArray(BitmapFactory.java)
       at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:561)
       at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:591)
       at com.sagacollect.utils.FileUtils.compressCapture(FileUtils.java:9)

Есть идеи о том, что может произойти?

Приветствия, Маурисио

1 Ответ

1 голос
/ 19 февраля 2020

Возможно, у вашей виртуальной машины недостаточно памяти. Вы можете попробовать добавить

android:largeHeap="true"

в файл манифеста. xml и посмотреть, решит ли это проблему. Это не рекомендуется в качестве постоянного решения, если это действительно не нужно, но может помочь вам устранить неполадки

Существуют библиотеки загрузки изображений, которые можно использовать, например, Пикассо , Катушка или Glide , которые лучше помогут с проблемами сжатия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...