개발 공부/안드로이드

android 권한 요청

yong_DD 2022. 7. 3. 15:32

권한을 요청할 때 라이브러리만 사용을 했었는데, 제공하는 것만으로도 간단하게 요청할 수 있다.

안드로이드에서 말하는 권한 워크플로는 아래와 같다.

권한 확인 여부 → (권한 없을시) 권한 요청 →

(권한 거부시) 권한이 왜 필요한지 설명 → 권한 요청


상단의 플로우를 따라 예시로 내부 저장소 권한을 요청하는 코드를 작성하면 이렇다.

(android develope 예시)

when {
    ContextCompat.checkSelfPermission(
            this,
            android.Manifest.permission.READ_EXTERNAL_STORAGE
            ) == PackageManager.PERMISSION_GRANTED -> {
        // 내부 저장소 접근하는 코드 작성
    }
    shouldShowRequestPermissionRationale(android.Manifest.permission.READ_EXTERNAL_STORAGE) -> {
       // 권한이 왜 필요한지 요청하는 코드 작성
    }
    else -> {
        // 한 개만 요청
        requestPermissionLauncher.launch(
                android.Manifest.permission.READ_EXTERNAL_STORAGE)
      
       //여러개 요청시 
         requestPermissions(CONTEXT,
                arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE
                       ,android.Manifest.permission.WRITE_EXTERNAL_STORAGE),
                111)
     }
}

// 한 개만 요청 응답
val requestPermissionLauncher =
    registerForActivityResult(ActivityResultContracts.RequestPermission()
    ) { isGranted: Boolean ->
        if (isGranted) {
            // 내부 저장소 접근하는 코드 작성
        } else {
            // 권한 거절
        }
    }

// 여러개 요청 응답
override fun onRequestPermissionsResult(requestCode: Int,
        permissions: Array<String>, grantResults: IntArray) {
    when (requestCode) {
        111 -> {
            if ((grantResults.isNotEmpty() &&
                    grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                // 첫 번째 권한 요청 승인
            } else {
                // 나머지 필요 부분 작성
            }
            return
        }

        else -> {
            // 요청 코드가 아니라서 무시
        }
    }
}

1. ContextCompat.checkSelfPermission

매개변수로 받은 권한이 거부된 상태인지 승인된 상태인지 반환

(PackageManager.PERMISSION_DENIED, PackageManager.PERMISSION_GRANTED)

2. shouldShowRequestPermissionRationale()

권한의 필요성을 설명할 UI를 띄워야하는 경우인지를 반환

(권한을 거부한 경우 true, 권한을 허용하거나 거부한 적이 없는 경우-요청이 처음인 경우 false)

3. requestPermissions()

권한 요청을 화면을 띄우고 선택한 값을 onRequestPermissionsResult이나

registerForActivityResult(ActivityResultContracts.RequestPermission())에 보냄

requstPermission을 요청하면 나오는 화면