경험의 기록

2021.06.25 - [안드로이드/기본] - [Android] 안드로이드 권한 (Permission) 체크하기 - 위치정보 사용하기

 

[Kotlin] 안드로이드 권한 (Permission) 체크하기 - 위치정보 사용하기

안드로이드에서는 특정 동작을 위하여 권한이 필요하다. 마시멜로 버전 이전에는 앱 설치시 모든 권한이 요청되었지만 이후 버전에서는 권한이 크게 일반 권한과 위험 권한으로 나뉘었다. 일반

hanyeop.tistory.com

위치 권한을 요청할때에는

위의 글의 방식처럼

 ActivityCompat.requestPermissions(
                        requireActivity(),
                        arrayOf(android.Manifest.permission.ACCESS_COARSE_LOCATION,
                            android.Manifest.permission.ACCESS_FINE_LOCATION,
                            android.Manifest.permission.ACCESS_BACKGROUND_LOCATION),
                        1
                    )
                   

이렇게 한번에 요청해서, 백그라운드 권한까지 받을 수 있었다.

 

앱의 기능이 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)
            }
        }
    }

이제 동의를 요구하는 부분에서 호출해주면

 

기본적인 위치 권한을 요구하고,

 

다이얼로그로 백그라운드 위치 권한을 요구하며

 

설정창으로 이동되어 항상 허용 상태로 변경하게 할 수 있다.

 

 

 

참고

https://developer.android.com/training/location/permissions?hl=ko#foreground 

 

 

 

 

 

 

 

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading