2019. 11. 5. 16:02ㆍProgramming/Android
API를 호출했을 때 Content-type이 image/jpeg로 설정되는 경우, 응답에 JPEG파일이 실려오게 된다. 크롬의 개발자 도구에서 네트워크 탭을 통해 응답을 확인해보면, 실제로 이미지 파일이 응답 본문(Response Body)에 실려오는 것을 볼 수 있다. 그렇다면 Android에서 Retrofit2를 이용하여, 이러한 Bitmap을 처리하려면 어떻게 해야할까?
우선은 아래와 같이 interface를 작성해준다. 파일 용량이 적을 경우에는 @Streaming을 생략해도 잘 동작한다. Call에 넘겨주는 ResponseBody는 okhttp3패키지의 ResponseBody이다.
JAVA를 사용하여 작성한 코드
public interface DonwloadImage { @GET("images/{apiName}") @Streaming //용량이 적을 경우 @Streaming은 생략이 가능하다. Call<ResponseBody> downloadImage(@Path("apiName") String apiName); }
KOTLIN을 사용하여 작성한 코드
interface DownloadImage { @GET("images/{apiName}") @Streaming //용량이 적을 경우 @Streaming은 생략이 가능하다. downloadImage(@Path("apiName") apiName:String):Call<ResponseBody>; }
interface를 작성했다면 Retrofit2를 이용하여 API를 호출해주면 된다. 응답을 받아서 Bitmap 객체를 이용해 이미지를 처리하려면, 다음과 같이 코드를 작성하자. 이미지의 로우 데이터는 response.body()를 byteStream으로 읽어들여서, BitmapFactory.decodeStream으로 디코딩하면 Bitmap 객체가 반환된다. 이제 처리가 끝난 Bitmap 객체를 이용해 저장하거나 화면상에 띄우는 작업을 할 수 있다.
JAVA를 사용하여 작성한 코드
new Callback<ResponseBody>(){ @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { InputStream is = response.body().byteStream(); Bitmap bitmap = BitmapFactory.decodeStream(is); } }
KOTLIN을 사용하여 작성한 코드
object: Callback<String> { override fun onResponse(call: Call<String>, response: Response<String>) { val is = response.body().byteStream() val bitmap = BitmapFactory.decodeStream(is) } }
같은 방법으로 서버에서 파일을 다운받아, 클라이언트에 저장하는 등의 처리도 가능하다. 해당 내용은 How to download Files from server - Future Studio의 내용을 참조하도록 하자.
참조
Retrofit 2 download image and save to folder - StackOverflow
How to download Files from server - Future Studio
'Programming > Android' 카테고리의 다른 글
| Retrofit2를 사용하여 서버의 Digest 인증을 처리하기 (0) | 2019.11.19 |
|---|---|
| CLEARTEXT communication to [TARGET_ADDRESS] not permitted by network security policy (0) | 2019.11.08 |
| Kotlin <-> Java 클래스를 서로 참조 못할 때(Can not find symbol) (0) | 2019.11.03 |
| 어플리케이션의 HTTP 라이브러리를 Volley에서 Retrofit2로 교체한 후기 #1 (0) | 2019.10.24 |
| 3일에 걸친 리펙토링을 하고나서, 코드를 잘 작성하는 법에 대해 생각해봤다. (2) | 2019.09.15 |