我正在开发一个应用程序,该应用程序在某个时刻必须压缩图片才能将其发送到服务器。如果压缩不起作用,它会发送未压缩的照片(没什么大不了的(。
尽管压缩方法被一个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等图像加载库来更好地解决压缩问题。