안드로이드 앱 개발기 #12 - Glide 활용하여 이미지 다운로드 받는 코드
Glide 라이브러리를 활용하여 이미지를 다운로드 받는 코드를 구현해보았습니다. 다운로드는 크게 2가지 과정으로 구분됩니다.
- 외부 URL로부터 비트맵 다운로드 받기
- 비트맵을 파일로 저장
오늘은 코드를 공유하구요. 설명까지 적기는 쉽지 않네요. 보다 자세한 내용 정리는 필요하기 때문에 조만간 자세한 설명도 적어 보도록 하겠습니다.
Glide 활용하여 이미지를 비트맵으로 다운로드 받기
Context 클래스를 확장하는 함수로 구현하였습니다.
fun Context.downloadImage(imageURL: String, fileName: String, resultCallback: (isSuccessful: Boolean) -> Unit) {
Glide.with(this).load(imageURL).into(object: CustomTarget<Drawable>() {
override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
val bitmap = (resource as BitmapDrawable).bitmap
val isSuccessful = bitmap.saveAsFile(bitmap, fileName, contentResolver)
resultCallback(isSuccessful)
}
override fun onLoadCleared(placeholder: Drawable?) {
}
override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable)
resultCallback(false)
}
})
}
비트맵을 파일로 저장
Bitmap 클래스를 확장하는 함수로 구현하였습니다.
fun Bitmap.saveAsFile(bitmap: Bitmap, fileName: String, contentResolver: ContentResolver): Boolean {
var imageOutStream: OutputStream
val targetDirectory = Environment.DIRECTORY_PICTURES
val fileExtension = fileName.getFileExtension()
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
val imagePath = Environment.getExternalStoragePublicDirectory(targetDirectory)
val imageFile = File(imagePath, fileName)
imageOutStream = FileOutputStream(imageFile)
}
else {
val values = ContentValues().apply {
val mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension) ?: ""
put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
put(MediaStore.Images.Media.MIME_TYPE, mimeType)
put(MediaStore.Images.Media.RELATIVE_PATH, targetDirectory)
}
val uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values) ?: return false
imageOutStream = contentResolver.openOutputStream(uri) ?: return false
}
imageOutStream.use { outputStream ->
return bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
}
return false
}
지난 안드로이드 앱 개발기
- #11 - 처리할 수 없는 예외/크래쉬 발생시 앱 재시작하기
- #10 - 안드로이드 스튜디오 업그레이드 후 단축키가 안되면? (맥북)
- #9 - LiveData 객체에 동일 데이터 설정하면 observer 실행되는지 확인 목적의 샘플 프로젝트
- #8 - 안드로이드 스튜디오에서 빌드시 발생하는 Build Tools revision 31.0.0 오류
- #7 - 'UGC(사용자 생성 콘텐츠) 정책 미준수'로 심사 거절
- #6 - 뷰에 역마진 적용 불가시 translationX, translationY 속성 사용하기
- #5 - 프로젝트 생성 후 빌드시 발생 오류: The minCompileSdk (31) specified in a dependency's AAR metadata
- #4 - 프로젝트 생성 후 빌드시 발생 오류: The minCompileSdk (31) specified in a dependency's AAR metadata
- #3 - 무한 롤링 배너 만드는 법을 찾았으나, 높이를 wrap_content로 지정이 안 먹히는 문제점이...
- #2 - setContentView 메소드의 파라메터를 변경하지 않아서 발생한 화면 오류
- #1 - 페이스북 로그인 연동시 발생했던 문제들
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.