[안드로이드] 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();
}
댓글 영역