❗ 안드로이드 앱 마인드 블루밍의 개발 과정을 포스팅한 글입니다.
마인드 블루밍은 사진 업로드 혹은 사진·PDF로 내보내기 등의 이유로 외부 저장소📀에 대한 읽기, 쓰기 권한이 필요합니다.
마인드 블루밍에서는 ActivityResult API
를 사용하여 권한 요청 로직을 작성✍했습니다.
private val requestMultiplePermissions =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions())
{ permissions ->
run {
if (permissions[Manifest.permission.READ_EXTERNAL_STORAGE] == true
&& permissions[Manifest.permission.WRITE_EXTERNAL_STORAGE] == true) {
// permission granted
} else {
// permission denied
}
}
}
먼저 ActivityResultLauncher
변수를 생성합니다. ActivityResultLauncher
는 registerForActivityResult
의 반환값으로, 인자로 주어진 ActivityResultContract
를 실행하고 해당 작업이 완료되면 callback📞을 받아 처리하는laucher
입니다.
여기서는 RequestMultiplePermissions()
가 ActivityResultContract
이기 때문에 권한 획득 관련 작업🔨을 수행합니다.
private fun setPermissions() {
if (checkGranted(Manifest.permission.READ_EXTERNAL_STORAGE)
&& checkGranted(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// permission already granted
} else {
// permission not granted
requestMultiplePermissions.launch(
arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
)
}
}
private fun checkGranted(permission: String): Boolean {
return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED
}
checkSelfPermission()
메소드를 통해 먼저 권한을 이미 획득했는지 확인🧐합니다. 만약 권한을 획득하지 못했다면 ActivityResultLauncher
변수의 launch()
메소드를 통해 권한 획득 관련 작업을 시작합니다.
ActivityResult API
를 사용하여 권한 요청 로직을 개발하던 중 다음과 같은 오류🚫가 발생했습니다.
ActivityResult API
의 launch()
메소드를 사용하면 FragmentActivity.java
의 checkForValidRequestCode()
메소드에서 requestCode
의 하위 16비트만 set
되어 있는지 확인🧐합니다.
여기서 requestCode
는 ActivityResultRegistry.java
에서 자동으로 생성되는 유니크한 String key
를 통해 만들어집니다. 그렇기 때문에 상위 16비트에 set
된 비트가 존재하는 requestCode
가 생성될 수 있고, 위와 같은 오류가 발생하는 것입니다. 😥
이러한 문제를 해결한 것이 바로 androidx.fragment 라이브러리 종속성 ver 1.3.0-alpha05 입니다. 👏
// kotlin - build.gradle(app)
implementation 'androidx.activity:activity-ktx:1.2.0-rc01'
implementation 'androidx.fragment:fragment-ktx:1.3.0-rc01'
📢 결론적으로 ActivityResult API
사용하면서 "Can only use lower 16 bits for requestCode" 오류를 피하기 위해선 위와 같이 1.2.0
버전 이상의 androidx.activity
종속성과 1.3.0-alpha05
버전 이상의 androidx.fragment
종속성 모두 사용해야 합니다.