728x90
사용자가 프로필 사진을 변경하기 위해 갤러리에서 사진을 선택해 가져오는 로직이 노후화되어 전체적으로 재구성했다.
registerForActivityResult를 활용했다.
https://developer.android.com/training/basics/intents/result?hl=ko
먼저 갤러리로 진입할 수 있는 로직을 작성한다.
val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) AppPermissions.readMediaFilesPermissions
else AppPermissions.writeExternalPermission
if (!AppPermissions.hasGranted(this, permissions)) {
ActivityCompat.requestPermissions(this, permissions, RC_PICK_PERMISSIONS)
} else {
goToGallery()
}
버튼을 클릭 시에 저장소 접근 권한 체크를 진행하여 허가된 상태라면 바로 갤러리로, 아니라면 권한 허가 요청을 먼저 진행한다.
권한 허가가 완료된 이후 갤러리로 이동한다.
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
val passAllPermission = grantResults.indices.none { grantResults[it] != PackageManager.PERMISSION_GRANTED }
if (passAllPermission) {
when (requestCode) {
RC_PICK_PERMISSIONS -> goToGallery()
......
goToGallery 내부는 다음과 같다.
try { photoSelectLauncher.launch("image/*")
} catch (ex: android.content.ActivityNotFoundException) { ex.printStackTrace() }
Launcher를 구성해 준다.
private val photoSelectLauncher = registerForActivityResult(GetContent()) { uri ->
if (uri != null) getImgInfo(uri)
}
GetContent()는 사용자가 디바이스에서 어떤 형태의 콘텐츠 파일을 선택할 때 사용되는 Launcher다.
반환된 uri를 통해 데이터 확인이 가능하다.
@SuppressLint("Range")
private fun updateProfileImg(uri: Uri) {
val cursor = contentResolver.query(uri, null, null, null, null, null)
cursor.use {
if (cursor != null && cursor.moveToFirst()) {
val displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME))
......
}
}
}
이제 파일명, 파일 Size 등을 가져올 수 있으며, uri를 활용하여 이미지 자체를 Glide로 표시할 수도 있다.
728x90