Kotlin

[Kotlin] Transaction too large 에러 해결방법

eulBlue 2023. 8. 13. 21:13

📱테스트 환경

Samsung Galaxy Android 13 • Android 10


😢 내가 겪은 문제

이미지 뷰어를 만들고있었는데, Room 에서 가져온 ByteArray 형식의 이미지를 intent.putExtra 를 통해 이미지를 보여주고 있었다.

테스트 할 때는 딱히 크러시가 발생하는 일이 없었는데 3000x4000 해상도의 JPEG 형식의 이미지를 뷰어로 만드려고 했을 때 에러가 발생했다. 이유는 이미지 크기가 너무 커서 Extra 로는 보낼 수 없다는게 주요 내용이였다.

intent.putExtra("imageBitmap", imageByteArray)

오류를 해결하기 위해서는 외부 저장소에 파일을 저장하고, 저장 경로를 전송해 주는 방식으로 해결 했는데 이 방법의 문제점은 저장소에 파일이 계속 쌓여서 용량이 커질 수 있다는 부분이다. 이를 해결하기 위해서 뷰어가 닫힐 때 파일을 삭제하는 방법을 사용하였다.

다음은 내가 사용한 코드이다.

saveImageToFile.kt

해당 함수의 역할은 이미지 바이트 배열을 파일로 저장하고, 해당 경로를 반환하는 방식이다.

fun saveImageToFile(context: Context, imageByteArray: ByteArray): File {
    val storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
    val imageFile = File.createTempFile(
        "image_",  /* prefix */
        ".jpg",    /* suffix */
        storageDir /* directory */
    )
    val outputStream = FileOutputStream(imageFile)
    outputStream.write(imageByteArray)
    outputStream.close()
    return imageFile
}

ContextActivity.kt

ByteArray 형식의 이미지를 imageFile 로 만들고 경로를 받아온뒤 intet.putExtra 를 통해 ImageViewerActivity 에 보내준다.

val imageFile = saveImageToFile(context, imageByteArray)

val intent = Intent(context, ImageViewerActivity::class.java)
intent.putExtra("imageFile", imageFile.absolutePath)

ImageViewerActivity.kt

getStringExtra 를 통해 파일 경로를 받아와서, 디코드 해주면 끝난다 !!

val imageFilePath = intent.getStringExtra("imageFile")

val imageBitmap = BitmapFactory.decodeFile(imageFilePath)

 

구글이나 내가 가지고 있던 이미지로 테스트 했을 때는 에러가 안나서 이런 문제가 발생할꺼라고는 생각하지 못했었는데

비싼 카메라로 찍은 사진들은 해상도가 참 높은 것 같다..

그래도 덕분에 문제를 발견해서 해결할 수 있었으니 재미있었다 !!