[Kotlin_Android] 프로필사진 설정후 어플리케이션에 저장하기

Jamwon·2021년 9월 13일
1

Kotlin_Android

목록 보기
28/30
post-thumbnail

사용자의 프로필 사진을 어플리케이션내에 저장하기 위해서 Bitmap그 자체를 이용하고 싶었지만 그게 불가능했다!!!

그래서 알아보니,,,BASE64 인코딩 디코딩을 이용해서
Bitmap은 String으로 인코딩해서 저장하고, String은 Bitmap으로 디코딩해서 이미지를 지정해주면 된다.

Sharedpreferences에 Bitamp형식으로 바로 저장하고 싶었지만 저장이안되었다. (혹시나 된다면 댓글로 알려주세요ㅠㅠ)

참고 사이트

StringtoBitmap

위의 웹페이지에 있는 Java함수를 코틀린으로 변환하여 사용하였다.

convertBitMap

class convertBitMap {
    fun BitmapToString(bitmap: Bitmap): String {
        val baos =
            ByteArrayOutputStream() //바이트 배열을 차례대로 읽어 들이기위한 ByteArrayOutputStream클래스 선언
        bitmap.compress(Bitmap.CompressFormat.PNG, 70, baos) //bitmap을 압축 (숫자 70은 70%로 압축한다는 뜻)
        val bytes = baos.toByteArray() //해당 bitmap을 byte배열로 바꿔준다.
        return Base64.encodeToString(bytes, Base64.DEFAULT) //Base 64 방식으로byte 배열을 String으로 변환
        //String을 retrurn
    }
    fun StringToBitmap(encodedString: String?): Bitmap? {
        return try {
            val encodeByte: ByteArray = Base64.decode(
                encodedString,
                Base64.DEFAULT
            ) // String 화 된 이미지를  base64방식으로 인코딩하여 byte배열을 만듬
            BitmapFactory.decodeByteArray(
                encodeByte,
                0,
                encodeByte.size
            ) //byte배열을 bitmapfactory 메소드를 이용하여 비트맵으로 바꿔준다.
            //만들어진 bitmap을 return
        } catch (e: Exception) {
            e.message
            null
        }
    }
}

위와같이 따로 클래스를 만들어서 두 함수를 넣어주었다.

selectGalley()

fun selectGalley() {
    var intent = Intent(Intent.ACTION_PICK)
    intent.data = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    intent.type = "image/*"
    startActivityForResult(intent, GALLERY)

}

이 함수는 프로필사진을 눌렀을때 실행되는 함수로 intetent로 갤러리를 띄워주고 이미지를 불러올 수 있다.

GALLERY는 requestCode로 따로 const값으로 정의해주자

위의 함수를 호출하면 onActivityResult() 오버라이드 함수에서 그 이미지를 이용할 수 있다.

override fun onActivityResult()

if (requestCode == GALLERY) {
if (resultCode == RESULT_OK) {
var currentImageUrl: Uri? = data?.data
try {
val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, currentImageUrl)
img_mypage_profile.setImageBitmap(bitmap)
sharedManager.setUserImg(convertBitMap().BitmapToString(bitmap))
// viewModel.editProfileImg(convertBitMap().BitmapToString(bitmap))

                Log.d("Profileimg","uri,$currentImageUrl bitmap $bitmap")
            } catch (e: Exception) {
                e.printStackTrace()
            }

        } else {
            Log.d("ActivityResult", "error")
        }

    }

위와같이 아까 정해둔 requestCode GALLERY에 대한 onActivityResult를 처리한다.

이미지를 data로 받아오고 BitMap으로 변환해준다.
(현재 ViewModel를 적용중이지만 이건 PASS)

위와 같이 sharedManager.setUserImg 함수에 bitmap을 String값으로 인코딩한뒤에 저장해둔다.

sharedManager에 관한건 전에 작성한 내용 부분에 img를 String값으로 추가만 해주었다.

그 뒤로 Fragment에서 currentUser를 불러와 인코딩된 String값을 다시 디코딩해서 마이페이지가 열릴때 프로필 사진을 지정해주었다.

view.img_mypage_profile.setImageBitmap(convertBitMap().StringToBitmap(currentUser.img))

위와 같은 식으로 지정했다!

혹시 더 나은 방법이 있다면 알려주세요!!!

ViewModel은 아직 적용이안되었지만 이미지를 저장하고 처리하는걸 처음해봐서 시간이조금 걸렸다.. 서버랑도 연결해야되는데..!

졸업프로젝트가 거의다 끝나간다..!

profile
한걸음씩 위로 자유롭게

0개의 댓글