경험의 기록

안드로이드에서는 특정 동작을 위하여 권한이 필요하다.

마시멜로 버전 이전에는 앱 설치시 모든 권한이 요청되었지만 이후 버전에서는 권한이 크게 일반 권한위험 권한으로 나뉘었다.

 

일반권한은 개인정보를 요청하지 않는 권한으로 앱 설치시 권한을 요청하며, 대표적으로 인터넷 접근 권한, 와이파이 접근 권한, 블루투스 접근 권한 등이 있다.

 

위험권한은 개인정보를 요청하는 권한으로 그 기능이 동작할때 권한을 요청하며, 대표적으로 카메라, 위치, 갤러리, 주소록 권한 등이 있다.

▲ 위험 권한의 종류

그룹 내 권한이 허용되었다면, 동일 그룹내 권한이 요청될 경우 자동으로 허용한다.

 

안드로이드 developer에서 퍼미션 정보들을 확인할 수 있다.

developer.android.com/reference/kotlin/android/Manifest.permission#summary

 

Manifest.permission  |  Android 개발자  |  Android Developers

 

developer.android.com


위치정보 사용하기

권한 추가

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

위치권한을 위해 퍼미션을 추가해준다.

FINE은 GPS 센서, COARSE는 네트워크로 위치를 측정한다.

백그라운드 작업이 필요하지 않다면 백그라운드 로케이션은 추가하지 않아도 된다.

 

권한 확인하기

runStartFab.setOnClickListener {

                // 권한 체크해서 권한이 있을 때
                if(ContextCompat.checkSelfPermission(requireActivity(),android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
                    && ContextCompat.checkSelfPermission(requireActivity(),android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                    && ContextCompat.checkSelfPermission(requireActivity(),android.Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_GRANTED){

                    findNavController().navigate(R.id.action_runFragment_to_trackingActivity)
                }

                // 권한이 없을 때 권한을 요구함
                else {
                    ActivityCompat.requestPermissions(
                        requireActivity(),
                        arrayOf(android.Manifest.permission.ACCESS_COARSE_LOCATION,
                            android.Manifest.permission.ACCESS_FINE_LOCATION,
                            android.Manifest.permission.ACCESS_BACKGROUND_LOCATION),
                        1
                    )
                }
            }

 

권한 체크

ContextCompat.checkSelfPermission(컨텍스트(), 퍼미션정보) == PackageManager.PERMISSION_GRANTED

checkSelfPermission으로 권한이 있는지 여부를 확인할 수 있다.

액티비티에서는 자기 자신을, 프래그먼트에서 사용할 때에는 requireActivity를  context로 사용한다.

 

PERMISSION_DENIED 를 사용할 경우 권한이 없다의 조건으로 사용할 수 있다.

 

 

권한 요청

ActivityCompat.requestPermissions(컨텍스트(),arrayOf(퍼미션정보),요청값)

requestPermissions로 권한을 요청할 수 있다.

qrrayof의 인자로 권한들을 나열해주면 되고, 요청값이 반환된다.

 

 

요청 결과

// 권한 요청 결과 처리
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)

        if(requestCode == 1){
            if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                Snackbar.make(binding.root, "위치 권한이 동의 되었습니다.", Snackbar.LENGTH_SHORT).show()
            }
            else{
                Snackbar.make(binding.root, "권한에 동의하지 않을 경우 이용할 수 없습니다.", Snackbar.LENGTH_SHORT).show()
            }
        }
    }

권한이 요청되고 나면 onRequestPermissionsResult 이 호출된다.

요청값을 확인하여

grantResults가 비어있지 않고, 첫번째 값이 동의 상태라면 권한이 있는 것이므로 동의한 내용을 처리해주면 되고,

 

아닐 경우 동의하지 않은 것이다.

 

단, 프래그먼트에서 권한을 요청했을경우 onRequestPermissionsResult 는 부모액티비티에서 호출된다.

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading