Я работаю над приложением, которое в определенный момент должно сжать изображение, чтобы отправить его на сервер. Если сжатие не работает, он отправляет несжатую фотографию (не имеет значения).
Несмотря на то, что метод сжатия окружен методом 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)
Есть идеи о том, что может произойти?
Приветствия, Маурисио