压缩图片时出现内存不足错误



我正在开发一个应用程序,该应用程序在某个时刻必须压缩图片才能将其发送到服务器。如果压缩不起作用,它会发送未压缩的照片(没什么大不了的(。

尽管压缩方法被一个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
}
}

如果返回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)

你知道会发生什么吗?

干杯,毛里西奥

可能是您的虚拟机内存不足。你可以尝试添加

android:largeHeap="true"

到您的manifest.xml文件,看看这是否解决了问题。除非真的有必要,否则不建议将其作为永久解决方案,但可能会帮助您进行故障排除。

你可以使用Picasso、Coil或Glide等图像加载库来更好地解决压缩问题。

相关内容

  • 没有找到相关文章

最新更新