[Android] Permission

델버·2022년 6월 9일
0

Android

목록 보기
3/5

앱에서 권한을 요청을 하는 방법을 알아봅시다. 그것도 Kotlin으로. 그것이 정답이니까.

처음엔 한 가지 권한을 요청하는 방법을 보고 뒤로 여러 가지의 권한을 요청하는 방법을 봅시다.


한 가지 권한 요청

1. 먼저 테스트용 버튼을 만들어 주었다. 버튼을 누르면 (카메라)권한을 요청하도록 만들 것이다.

2. manifest에서 권한 요청을 해준다.


// 카메라 권한 요청
<uses-permission android:name="android.permission.CAMERA"/>
// 위치 권한 요청 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

3. field에 ActivityResultLauncher 변수를 만들어 준다.

  • toast로 사용자에게 권한이 어떤 상태인지 알려준다.
private val cameraResultLauncher : ActivityResultLauncher<String> =
        // 버튼을 누르면 권한 요청을 줄 메소드
        registerForActivityResult(
            ActivityResultContracts.RequestPermission()) {
            // 대화상자로 권한을 요청한다.
                isGranted ->
                // boolean으로 권한이 승인 되었는지 확인한다.
                if(isGranted) {
                    Toast.makeText(this,
                        "카메라 권한 승인", Toast.LENGTH_LONG).show()
                } else {
                    Toast.makeText(this,
                        "카메라 권한 거절", Toast.LENGTH_LONG).show()
                }
            }

4. 버튼을 클릭 했을 때 권한 요청을 하여 launcher가 실행되는 메소드

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val btnCameraPermission : Button = findViewById(R.id.btn_Permission)
        btnCameraPermission.setOnClickListener {
            if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M &&
                shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)
            ){
                // 권한 요청을 거부한 상태면 true를 반환한다.
                Toast.makeText(this, "카메라 권한이 필요합니다", Toast.LENGTH_SHORT).show()
                // else if()로 shouldShowRequestPermissionRationale를 사용하여 다른 권한도
                // 이전 권한 결과값을 보여줄 수 있다.
            } else {
                cameraResultLauncher.launch(
                    Manifest.permission.CAMERA
                    // camera 권한
                )
            }
        }
    }

여러 가지 권한 요청

3. ActivityResultLauncher 설정

private val cameraAndLocationResultLauncher : ActivityResultLauncher<Array<String>> =
        registerForActivityResult(
            ActivityResultContracts.RequestMultiplePermissions()) {
                permissions ->
                permissions.entries.forEach{
                    // map으로 받아온 권한을 key와 value로 구분하여 요청 결과값을 받아옴
                    val permissionName = it.key  // 권한 이름
                    val isGranted = it.value     // 권한 요청 결과값
                    if(isGranted) {
                        if(permissionName == Manifest.permission.ACCESS_FINE_LOCATION) {
                            Toast.makeText(
                                this,
                                "fine location 권한 승인",
                                Toast.LENGTH_LONG
                            ).show()
                        }else if(permissionName == Manifest.permission.ACCESS_COARSE_LOCATION) {
                            Toast.makeText(
                                this,
                                "coarse location 권한 승인",
                                Toast.LENGTH_LONG
                            ).show()
                        }  else {
                            Toast.makeText(
                                this,
                                "카메라 권한 승인",
                                Toast.LENGTH_LONG
                            ).show()
                        }
                    } else {
                        if(permissionName == Manifest.permission.ACCESS_FINE_LOCATION) {
                            Toast.makeText(
                                this,
                                "fine location 권한 거절",
                                Toast.LENGTH_LONG
                            ).show()
                        } else if(permissionName == Manifest.permission.ACCESS_COARSE_LOCATION) {
                            Toast.makeText(
                                this,
                                "coarse location 권한 거절",
                                Toast.LENGTH_LONG
                            ).show()
                        } else {
                            Toast.makeText(
                                this,
                                "카메라 권한 거절",
                                Toast.LENGTH_LONG
                            ).show()
                        }
                    }
                }
        }

4. 버튼을 클릭 했을 때 권한 요청을 하여 launcher가 실행되는 메소드

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val btnCameraPermission : Button = findViewById(R.id.btn_Permission)
        btnCameraPermission.setOnClickListener {
            if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M &&
                shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)
            ){
                // 권한 요청을 거부한 상태면 true를 반환한다.
                Toast.makeText(this, "카메라 권한이 필요합니다", Toast.LENGTH_SHORT).show()
                // else if()로 shouldShowRequestPermissionRationale를 사용하여 다른 권한도
                // 이전 권한 결과값을 보여줄 수 있다.
            } else {
                cameraAndLocationResultLauncher.launch(
                    arrayOf(Manifest.permission.CAMERA,
                        Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_COARSE_LOCATION
                    )
                    // Array로 권한들을 넣어준다.
                )
            }
        }
    }

0개의 댓글