[안드로이드] BitmapFactory.decodeStream가 null을 반환하는 경우

 

@Override
public void onResponse(Call call, Response response) throws IOException {
	final String responseBody = response.body().string();
	Log.d("DEBUG", "responseBody = " + responseBody);

	ResponseBody in = response.body();

	if(in != null) {
		InputStream inputStream = in.byteStream();

		// convert inputstram to bufferinoutstream
		BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

		Bitmap bitmap = BitmapFactory.decodeStream(bufferedInputStream);

		//bitmap이 null임
	}
}

서버에서 전달받은 이미지를 BitmapFactory.decodeStream()함수를 통해 Bitmap으로 변환하면.. 어떤 경우에는 null이 계속 반환되는 것이 확인됐습니다.

 

서버에서 정상적인 이미지 data를 받아오는 것으로 보임에도 디코딩을 못하더라구요..

 

error가 아닌 warning으로 떠서 몰랐었는데..

잘 확인해보면.. 왜 디코딩에 실패했는지 로그가 있습니다. ㅜㅜ

 

W/System.err: java.io.IOException: closed
W/System.err:     at okio.RealBufferedSource$inputStream$1.read(RealBufferedSource.kt:154)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:248)
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:288)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:347)
        at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
        at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:790)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:765)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:806)
        at com.xxx.yyy.myActivity$33$1.run(myActivity.java:1910)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
D/skia: ---- read threw an exception
    --- Failed to create image decoder with message 'unimplemented'

 

몇 가지 코드를 수정해가면서 테스트한 결과...

okhttap의 callback함수의 onResponse()에서 서버에서 받아온 값을 확인하기 위해 썼던 아래의 코드가.. 문제의 원인이었습니다. ㅜㅜ

final String responseBody = response.body().string();

 

위의 코드를 제거하면.. 정상적으로 이미지를 읽어오고 에러가 발생하지 않습니다.

 

만약.. 디코딩이 실패하여 bitmap이 null일 때.. inputStream을 다시 읽고 싶다면.. 아래의 방법을 써야합니다.

BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
bufferedInputStream.mark(5);


bitmap = BitmapFactory.decodeStream(bufferedInputStream);

if(bitmap == null){
	bufferedInputStream.reset();

	String strResponse = convertStreamToString(bufferedInputStream);
	
}

BufferedInputStream을 사용하기 전에 mark()함수로.. 현재 위치?와 읽을 글자(바이트 단위)를 미리 기록합니다.

그리고.. 다시 BufferedInputStream을 읽고 싶으면 reset()함수를 사용하면 됩니다.

 

흠.. mark() 함수에서 사용되는 인자는 정확하게 무엇을 의미하는지 모르겠네요.

몇 가지 테스트를 해봐도.. 원하는 대로 동작하지가 않네요.. ㅎㅎ;;

뭐 .. 적당한 값을 대충 줘도 동작에는 문제가 없는 것 같습니다.

 

BufferedInputStream을 String으로 바꾸는 함수는 아래에 있습니다.

 public static String convertStreamToString(BufferedInputStream is) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line).append('\n');
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }

 

작성자

Posted by 드리머즈

관련 글

댓글 영역