앱의 기능이 Android 10(API 29)을 실행하는 기기에서 백그라운드 위치를 요청하면 시스템 권한 대화상자에는항상 허용이라는 옵션이 포함되고, 사용자가 이 옵션을 선택하면 앱의 기능에 백그라운드 위치 정보 액세스 권한이 부여된다.
하지만 Android 11(API 30) 이상에서는 시스템 대화상자에항상 허용옵션이 포함되지 않는다.
또한, 포그라운드 위치 정보 액세스 권한과 백그라운드 위치 정보 액세스 권한을 동시에 요청하면 시스템이 요청을 무시하고 앱에 어떤 권한도 부여하지 않는다.
그렇기 때문에 별도로 권한 요청을 해야한다.
// 안드로이드 API 30 버전부터는 backgroundPermission 을 직접 설정해야함
private fun backgroundPermission(){
ActivityCompat.requestPermissions(
requireActivity(),
arrayOf(
android.Manifest.permission.ACCESS_BACKGROUND_LOCATION,
), 2)
}
백그라운드 권한을 요청하는 함수를 작성해주고
// 백그라운드 권한 요청
private fun permissionDialog(context : Context){
var builder = AlertDialog.Builder(context)
builder.setTitle("백그라운드 위치 권한을 위해 항상 허용으로 설정해주세요.")
var listener = DialogInterface.OnClickListener { _, p1 ->
when (p1) {
DialogInterface.BUTTON_POSITIVE ->
backgroundPermission()
}
}
builder.setPositiveButton("네", listener)
builder.setNegativeButton("아니오", null)
builder.show()
}
백그라운드 권한 동의 설명을 위해 다이얼로그를 만들어준다.
private fun requestPermission(){
// 이미 권한이 있으면 그냥 리턴
if(TrackingUtility.hasLocationPermissions(requireContext())){
return
}
else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ActivityCompat.requestPermissions(
requireActivity(),
arrayOf(
android.Manifest.permission.ACCESS_COARSE_LOCATION,
android.Manifest.permission.ACCESS_FINE_LOCATION
), 1)
permissionDialog(requireContext())
}
// API 23 미만 버전에서는 ACCESS_BACKGROUND_LOCATION X
else {
ActivityCompat.requestPermissions(
requireActivity(),
arrayOf(
android.Manifest.permission.ACCESS_COARSE_LOCATION,
android.Manifest.permission.ACCESS_FINE_LOCATION
), 1)
}
}
}