런타임 퍼미션

김종주·2023년 7월 25일

권한의 유형

1. 권한 명세

  • <uses - permission>

2. 기능 명세

  • <uses - feature>
  • 플레이 스토어에 올렸을 때 해당 기능이 있는기기만 사용할 수 있음

권한 보호 수준

1. 일반권한

  • 일반권한으로 설정 팡일인 Android Manifest에 명시하면 설치시 사용자에게 권한 승일을 묻는 팝업창 생성
  • 인터넷 사용, 알림 설정 등

2. 위험권한

  • 앱이 사용자의 개인정보와 관련된 데이터나 기능을 액세스 하거나 다른 앱 및 기기의 작동에 영향을 줄 우려가 있는 권한

3. 서명 권한

  • 권한을 사용하려는 앱이 권한을 정의하는 앱과 동일한 인증서로 서명된 경우 시스템은 권한을 자동으로 등록

Runtime Permission 등록 방법

1. Manifest 에 받고자 하는 권한 등록

    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission
        android:name="android.permission.BLUETOOTH_SCAN"
        android:usesPermissionFlags="neverForLocation"
        tools:targetApi="s" />

2. 해당 권한이 허용됐는지 거부 됐는지 확인

    private fun hasPermissions(permissions: Array<String>): Boolean {

        for (permission in permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission)
                != PackageManager.PERMISSION_GRANTED
            ) {
                Timber.d("PERMISSION CHECK : $permission NOT GRANTED")
                return false
            }
        }

        return true
    }
  • 해당 함수를 만들어 해당함수의 매개변수로 받은 권한이 허용되었는지 거부되었는지 확인
  • return value
    • false : 거부됨
    • true : 허용됨

3. registerForActivityResult 콜백 작성

    private val requestPermission =
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {

            // check android 13
            if(Build.VERSION.SDK_INT == Build.VERSION_CODES.TIRAMISU) {

                if(it[android.Manifest.permission.BLUETOOTH_SCAN] == true ||
                    it[android.Manifest.permission.BLUETOOTH_CONNECT] == true
                ) {
                    // 권한 허용 시 
                }
                else {
                    // 권한 두 번째 거절 시 다시 권한 허용 팝업 창이 생기지 않음으로 세팅화면으로 이동 시켜야 함
                    if(!shouldShowRequestPermissionRationale(android.Manifest.permission.BLUETOOTH_SCAN) ||
                            !shouldShowRequestPermissionRationale(android.Manifest.permission.BLUETOOTH_CONNECT)) {

                        // 권한 두번째 거절시 처리
                    }
                    // 첫 번째 거절 시
                    else {
                        //권한 첫번 째 거절 시 처리
                    }
                }
            }
        }
  • 주의해야 할 점은 시스템에서 팝업 시켜주는 권한 허용 다이얼로그에서 2번 거절하면 다시 시스템에서 권한 허용 다이얼로그를 팝업 시켜 주지 않음으로 세팅 화면으로 이동 시켜주어야 함

4. 콜백 실행

   val bluetoothPermissionArray: Array<String> = arrayOf(
        android.Manifest.permission.BLUETOOTH_SCAN,
        android.Manifest.permission.BLUETOOTH_CONNECT
    )
    
    requsetPermission.launch(bluetoothPermissionArray)
profile
Wanna be developer

0개의 댓글