본문 바로가기
IT/Android

Location 백그라운드에서 위치 정보 액세스 및 권한 팝업

by 큰공 2024. 1. 31.
728x90
반응형

Location 백그라운드에서 위치 정보 액세스 및 권한 팝업

 안드로이드에서 GPS 좌표를 획득하기 위해서는 사용자에게 권한 승인을 받아야 합니다. Android 13에서 해당 권한 팝업을 띄우는 방법에 대해서 기술하고, 상세하게 살펴보고자 합니다. 권한 팝업을 띄우는 방법에 대해서만 기술 하고, 실제 Location 정보를 얻는 방법에 대해서는 기술되어 있지 않습니다.

 

Location 권한 종류

<manifest ... >
  <!-- Always include this permission -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  <!-- Include only if your app benefits from precise location access. -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  
  <!-- Required only when requesting background location access on
       Android 10 (API level 29) and higher. -->
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
  
</manifest>

 

 Android 의 위치 권한은 크게 위 3가지 permission 이 필요하며, 해당 권한이 Manifest.xml 에 정상적으로 등록되어 있어야 합니다.

 

  1. ACCESS_FINE_LOCATION:
    • 가장 정확한 위치 정보를 제공하는 권한입니다.
    • 이 권한을 부여하면 GPS, Wi-Fi, 및 기타 센서를 사용하여 상대적으로 정밀한 위치 정보를 얻을 수 있습니다.
    • 이 권한이 있는 경우 앱은 상당한 전력을 소모할 수 있으므로, 사용자의 배터리 수명에 영향을 미칠 수 있습니다.
    • 예를 들어, 네비게이션 앱이나 운동 추적 앱이 이 권한을 사용할 수 있습니다.
  2. ACCESS_COARSE_LOCATION:
    • 상대적으로 낮은 정밀도의 위치 정보를 제공하는 권한입니다.
    • 이 권한은 대개 기지국 위치나 Wi-Fi 네트워크를 기반으로 한 위치 정보를 제공합니다.
    • 전력 소모가 적고 빠르게 위치 정보를 획득할 수 있어, 사용자 경험에 덜 영향을 미칩니다.
    • 주로 지역 서비스 또는 기상 앱과 같이 정확한 위치가 크게 중요하지 않은 경우에 사용됩니다.
  3. ACCESS_BACKGROUND_LOCATION:
    • 이 권한은 앱이 백그라운드에서 지속적으로 위치 정보에 접근할 수 있도록 허용합니다.
    • 안드로이드 10 (API 레벨 29)부터는 백그라운드에서 위치 정보를 사용하는 경우 별도의 권한이 필요하게 되었습니다.
    • 이 권한이 없으면 앱은 백그라운드에서 위치 정보에 접근할 수 없습니다. 사용자에게 명시적으로 권한을 요청해야 합니다.
    • 백그라운드에서 위치 정보를 지속적으로 수집하는 앱들 (예: 위치 추적 앱)이 이 권한을 사용할 수 있습니다.

 

 상세한 권한 가이는 구글 가이드를 참고하시면 됩니다.

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

 

위치 정보 액세스 권한 요청  |  Android 개발자  |  Android Developers

위치 정보 액세스 권한 요청 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 사용자 개인 정보를 보호하려면 위치 서비스를 사용하는 앱에서 위치 정보 액세

developer.android.com

 

위치 정보 액세스 팝업 띄우기

        ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.ACCESS_FINE_LOCATION
                ,Manifest.permission.ACCESS_COARSE_LOCATION),
            LOCATION_PERMISSION_REQUEST_CODE
        )

 

ACCESS_FINE_LOCATION , ACCESS_COARSE_LOCATION 두 권한만 넣어서 requestPermissions을 전달하면 아래와 같이 팝업이 정상적으로 잘 뜨게 된다.

 

        ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.ACCESS_FINE_LOCATION
                ,Manifest.permission.ACCESS_COARSE_LOCATION
                ,Manifest.permission.ACCESS_BACKGROUND_LOCATION),
            LOCATION_PERMISSION_REQUEST_CODE
        )

 

하지만, ACCESS_BACKGROUND_LOCATION 을 권한 배열에 추가를 하면, 권한 팝업이 표시 되지 않습니다!

 

이 부분 때문에 본 문서를 작성하게 되었습니다. 어떻게 하면 ACCESS_FINE_LOCATION , ACCESS_COARSE_LOCATION 팝업과, ACCESS_BACKGROUND_LOCATION 권한 설정을 연속해서 띄울 수 있는지 살

펴 보도록 하겠습니다.

 

여러가지 디버깅을 해보면, 3가지 권한은 한 번에 설정이 되지 않는 것으로 파악됩니다. 이미, ACCESS_FINE_LOCATION , ACCESS_COARSE_LOCATION 이 권한을 획득한 상태라면, ACCESS_BACKGROUND_LOCATION 권한 설정은 표시 되지만 3가지 권한을 동시에 시도시에는 표시 되지 않습니다.

 

해결책

하나의 requestPermissions 에 3가지 권한을 동시에 하지 않고,  ACCESS_FINE_LOCATION , ACCESS_COARSE_LOCATION 이 승인이 된 이후에, ACCESS_BACKGROUND_LOCATION 를 요청하도록 해야 합니다.

 

    companion object {
        private const val LOCATION_PERMISSION_REQUEST_CODE = 321
        private const val LOCATION_BACKGROUND_PERMISSION_REQUEST_CODE = 3211
    }
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.ACCESS_FINE_LOCATION
                ,Manifest.permission.ACCESS_COARSE_LOCATION),
            LOCATION_PERMISSION_REQUEST_CODE
        )
  }
  
      override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 권한이 부여되면 현재 위치를 가져오는 메서드 호출
              ActivityCompat.requestPermissions(
                  this,
                  arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION),
                  LOCATION_BACKGROUND_PERMISSION_REQUEST_CODE
              )
            } else {
                // 권한이 거부되면 사용자에게 알림을 표시하거나 다른 조치를 취할 수 있음
            }
        }
    }

 

 

 

이렇게 하면, 권한 설정 팝업이 연속해서 두개 표시가 되게 됩니다.

 

요약

ACCESS_BACKGROUND_LOCATION requsetPermission 시에는 ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION 가 Granted 된 이후에 요청해야 한다.

728x90
반응형

댓글