[마인드 블루밍] 3. 개발 이슈 - 권한 획득

Hwichan Ji·2021년 1월 24일
0

마인드 블루밍

목록 보기
3/4
post-thumbnail

❗ 안드로이드 앱 마인드 블루밍의 개발 과정을 포스팅한 글입니다.

권한 요청

마인드 블루밍은 사진 업로드 혹은 사진·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 변수를 생성합니다. ActivityResultLauncherregisterForActivityResult의 반환값으로, 인자로 주어진 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() 메소드를 통해 권한 획득 관련 작업을 시작합니다.

Can only use lower 16 bits for requestCode Error

ActivityResult API를 사용하여 권한 요청 로직을 개발하던 중 다음과 같은 오류🚫가 발생했습니다.
error msg

ActivityResult APIlaunch() 메소드를 사용하면 FragmentActivity.javacheckForValidRequestCode() 메소드에서 requestCode의 하위 16비트만 set되어 있는지 확인🧐합니다.
code
여기서 requestCodeActivityResultRegistry.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 종속성 모두 사용해야 합니다.

profile
안드로이드 개발자를 꿈꾸는 사람

0개의 댓글