안드로이드에서는 특정 동작을 위하여 권한이 필요하다.
마시멜로 버전 이전에는 앱 설치시 모든 권한이 요청되었지만 이후 버전에서는 권한이 크게 일반 권한과 위험 권한으로 나뉘었다.
일반권한은 개인정보를 요청하지 않는 권한으로 앱 설치시 권한을 요청하며, 대표적으로 인터넷 접근 권한, 와이파이 접근 권한, 블루투스 접근 권한 등이 있다.
위험권한은 개인정보를 요청하는 권한으로 그 기능이 동작할때 권한을 요청하며, 대표적으로 카메라, 위치, 갤러리, 주소록 권한 등이 있다.
그룹 내 권한이 허용되었다면, 동일 그룹내 권한이 요청될 경우 자동으로 허용한다.
안드로이드 developer에서 퍼미션 정보들을 확인할 수 있다.
developer.android.com/reference/kotlin/android/Manifest.permission#summary
위치정보 사용하기
권한 추가
<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 는 부모액티비티에서 호출된다.