URL to Bitmap and URI

매일 수정하는 GNOSS LV5·2022년 2월 10일
2

AndroidStudio

목록 보기
44/83
post-custom-banner

상황

게시판에서 글을 작성해야 하며 해당 Fragment를 재사용하여 수정하기 기능도 추가하였다.
기존에 글을 작성할 때 사진 첨부가 가능하며 사진 관련 기능으로는
1. 갤러리에서 선택
2. 최대 5장까지 허용
3. 한장씩 혹은 여러개를 한번에 추가 가능
4. 리사이클러뷰에서 아이템의 x 버튼 클릭시 삭제 기능
5. URI를 가져와 File로 만든 후 MultipartBody.Part 로 변환해서 서버에 업로드

게시글 작성 기능을 완성 후 수정하기 기능을 추가하였는데 문제가 발생하였다.

원인

  • 서버에서 받아오는 이미진는 URL(”https://~~)형태 인데 이를 기존의 리사이클러뷰, 기존의 메서드에서 사용하기 위해서는 URI로 바꾸어야 했다.
  • URL은 핸드폰에 저장되어 있지 않기때문에 URI로 바꿀 수 없었다.
    → URL로 받은 이미지를 핸드폰에 저장을 해야 한다고 생각이 들음.
  • Glide를 이용하여 Bitmap으로 변환 하여 저장 후 URI로 변경하기로 결정

동작 코드

private fun convertURLtoURI(photos: List<PostContent>) {
        photos.forEach {
            Glide.with(requireActivity()).asBitmap().load(it.content)
                .into(object : CustomTarget<Bitmap>() {
                    override fun onLoadStarted(placeholder: Drawable?) {
                        super.onLoadStarted(placeholder)
                        viewModel.downloadImage()
                    }

                    override fun onResourceReady(
                        resource: Bitmap,
                        transition: Transition<in Bitmap>?
                    ) {
                        uris.add(getImageUri(requireContext(), resource))
												//모든 사진을 uri로 변환 후 뷰모델에 알림.
                        if (uris.size == photos.size) {
                            viewModel.completeDownload()
                        }
                    }

                    override fun onLoadCleared(placeholder: Drawable?) {
                    }
                })
        }
    }
fun getImageUri(inContext: Context, inImage: Bitmap): Uri {
        val bytes = ByteArrayOutputStream()
        inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes)
        val path = MediaStore.Images.Media.insertImage(
            inContext.contentResolver,
            inImage,
            "Title",
            null
        )
        return Uri.parse(path)
    }

글라이드를 이용하여 쉽게 변환할 수 있었다.
forEach를 이용하여 모든 url을 uri 로 변환후 viewmodel에 작업이 끝남을 알려주고 이에 따라서 다음 작업을 진행하였다.

profile
러닝커브를 따라서 등반중입니다.
post-custom-banner

0개의 댓글