[Android] Android 위치 권한 변경 사항 🧭

Jay·2021년 6월 11일
0

Android

목록 보기
32/39
post-thumbnail

Android 11 버전 여러 업데이트 사항 중 개인정보 보호기능에서 크게 달라졌다는 글을 보았다.

곧 Android 12가 출시 되겠지만 그래도...

여러 프로젝트를 해보면서 지도에서 사용자 위치 접근에 대한 퍼미션을 많이 다뤘었다.
근데 정작 허용 여부를 물어보고 허용/비허용에 따른 동작만 다루었을 뿐, 허용에 대한 상세적인 이야기를 다뤄본 적이 없다.

그래서 Android에서의 위치 권한을 이번 글에서 다루고자 한다.


안드로이드 6,10,11 위치 권한 변경
위 글에서 충분히 자세히 설명을 해주시고 있고 난 여기에 덧붙여 설명하려 한다.

우선 위치 권한 퍼미션의 역사를 살펴보면
크게 Android 6.0 이전과 이후로 나눠진다.

Before Android 6.0 (1~22)

Android 6.0 이전에는 앱에서 필요한 권한을 사용자로부터 요구할 때 어플을 설치할 때 요구하였다.

After Android 6.0 (23-마시멜로)

Android 6.0 부터는 앱에서 필요한 권한이 있을 때 사용자로부터 권한을 그때 받게 되었다.

즉, 위치 권한이 필요한 시점에 사용자에게 요청할 수 있었다.

manifest

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

ACCESS_COARSE_LOCATION : 네트워크를 이용하여 단말기 위치 식별
ACCESS_FINE_LOCATION : GPS와 네트워크를 이용하여 단말기 위치 식별
(더 정확한 위치는 ACCESS_FINE_LOCATION이라고 한다.)

위치 권한 요청 코드

int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);

if(permissionCheck == PackageManager.PERMISSION_DENIED){ //위치 권한 확인
    
    //위치 권한 요청
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 0);
}


이러한 이미지를 통해 허용과 비허용을 체크할 수 있다.
그리고 그 상태에 따라 개발자는 분기처리를 하게 된다.


Android 8 (26)

Android 26에서는 위치 권한 변경 사항이라기보단 백그라운드 위치 제한을 두게 된다!

공식문서 say
기기 성능 개선을 위해 포그라운드 실행 중이지 않은 앱의 특정 동작을 제한한다.

Android 백그라운드 위치 제한

  • startService()를 사용하여 백그라운드 서비스 생성이 허용되지 않은 시점에 접근하려 할 경우 illegalStateException을 발생시킨다고 한다.
  • 배터리, 사용자 환경 및 시스템 상태를 유지하기 위해 Android 8.0를 실행하는 기기에서 백그라운드 앱 사용 시 위치 업데이트를 받는 빈도가 줄어듭니다. 라고 하면서 제한을 시키기 시작한다...

위치 권한 설정 여부와 관계없지만 Android 8에서 나타난 백그라운드 접근 제한을 시작으로 10부터는 백그라운드 위치 접근을 아예 분리시켜 놓게 된다!
이야기의 흐름 맥락 상 알고있으면 좋을 내용이다.


Android 10 (29)

Android 10에서는 백그라운드 위치 권한과 포그라운드 위치 권한으로 나뉘었다.

백그라운 위치 권한 - 화면이 보이지 않지만 위치는 체크 하고 있는
포그라운 위치 권한 - 앱의 화면이 보이는 상태에서 위치를 체크하게 되는

그래서 백그라운드 위치 권한 요청을 하려면 Manifest에 한 가지 더 추가해줘야 한다.

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

이렇게 지정해두게 된다면 권한 허용 여부를 물어보는 과정에서 Android 6과는 다르게 나타난다.

위의 사진에서 볼 수 있듯 3가지의 경우로 분기 처리가 된다.

  • 항상 허용 (Allow all the time)
    - 백그라운드, 포그라운드 모두 허용
  • 앱 사용 중에만 허용 (Allow only while using the app)
    - 포그라운드만 부분 허용
  • 거부 (deny)
    - 모두 거부

그렇다면 기존에 Android 6 이후에 Background 위치 권한 요청을 하지 않는다면 무슨 일이 일어날까?

여러 영향을 생각해봐야 OS 버전 업데이트를 하더라도 어플 문제가 없지 않을까?

역시나 정리를 해주신 분들이 있다 Android Q 새로운 위치 접근
위 글이 원문이다.

개발자 입장에서의 대응이 궁금해서 가져와봤다.

1️⃣ 사용자가 앱을 사용하는 동안에만 위치 정보를 확인하는 경우

  • 사용자 근처에서 특정 장소를 찾는 경우 (해당 앱이 사용자 포커스를 갖고 있는 경우) 기기 위치 정보를 필요로 할 수 있다.
  • Target SDK가 Q(10) 미만이라면, 시스템에서 ACCESS_BACKGROUND_LOCATION 권한을 자동으로 추가하게 되고 결국 불필요한 '항상 허용' 옵션이 표시된다.
  • Target SDK를 Q(10)으로 올리게 될 경우, ACCESS_BACKGROUND_LOCATION 권한을 완전히 제외할 수 있다.

2️⃣ 앱이 포그라운드 서비스를 통해 빈번하게 사용자 위치 정보를 확인하는 경우

  • 네비게이션 서비스가 대표적이다. (앱이 포커스를 갖고 있지 않더라도 지속적으로 위치를 확인해야 하는 경우)
  • 이런 경우엔 포그라운드 서비스를 이용하여 백그라운드 실행 및 위치 제한을 피할 수 있다. 근데 이런 경우도 이런저런 이유로 포그라운드 서비스 남용을 막기 위해 'location'이 포함된 경우 포그라운드 서비스를 통해 기기 위치 정보를 확인할 수 있다.
  • ACCESS_BACKGROUND_LOCATION 권한을 요청할 필요가 없고, 사용자가 '앱 사용 중에만 허용' 옵션을 선택한 경우에도 앱이 정상적으로 동작한다.

3️⃣ 앱이 백그라운드에서 위치 정보를 확인하는 경우

  • 위치 기반으로 사용자 위치를 알아내서 광고를 하는 경우!
  • 사용자가 '앱 사용중에만 허용' 옵션을 선택한 경우, 사용자가 앱을 끈 경우 위치 정보를 확인할 수 없다.... 이런 경우 ACCESS_BACKGROUND_LOCATION 권한을 요청해야 한다. 기기 위치 권한은 있지만 백그라운드 위치 권한이 없는 경우를 처리하는 별도 로직을 구현하고 권한이 필요한 이유를 잘 설명하는 UX가 필요하다!

정리

  • 내가 만든 어플의 타겟이 Android 10 (API 29) 이상을 타겟한다. 근데 백그라운드 위치 정보 엑세스는 필요하지 않다?
    - ACCESS_BACKGROUND_LOCATION 권한을 MANIFEST에서 삭제!
  • 내가 만든 어플의 타겟이 Android 10 (API 29) 이상을 타겟한다. 그리고 백그라운드 위치 정보를 필요로 한다!
    - 사용자에게 왜 필요한지를 알려주고 별도 로직을 구현하여 요청해야 한다.

백그라운드 정책 관련하여 더 궁금하다면 공식 문서를 살펴보자.
(개인적으로는 백그라운드 위치 접근에 대해 아주 많~이 제한,제약을 두려고 하는 것 같다)

위치 권한 여부 코드

int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);

if(permissionCheck == PackageManager.PERMISSION_DENIED){ //포그라운드 위치 권한 확인
    
    //위치 권한 요청
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 0);
}


int permissionCheck2 = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION);

if(permissionCheck == PackageManager.PERMISSION_DENIED){ //백그라운드 위치 권한 확인    
    //위치 권한 요청
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION}, 0);
}

Android 11 (30)

Android11에서는 사용자가 선택할 수 있는 위치 권한 옵션이 더 세분화 되었다. 😂

앞서 살펴보았듯
Android 10에서는 [항상 허용, 앱 사용중만 허용, 거부] 이렇게 3가지가 있었다.
Android 11에서는 [항상 허용, 앱 사용중만 허용, 이번만 허용, 거부] 이렇게 4가지로 나누어지게 되었다.

이번만 허용???

  • 말 그대로 일회성 권한이다.
  • 오랜 시간 사용 안한 앱은 권한이 자동 재설정된다. 권한을 필요로 하는 백그라운드에서 주로 돌아가는 앱은 자동 재설정 되는 것을 막게 사용자에게 요청 필요.
  • 사용자 개인 정보 보호 강화를 위해 추가된 방식!
  • 사용자가 일회성 위치 엑세스 권한을 추가하고 사용자가 백그라운드 위치 엑세스 권한을 부여하는 방식.

Android 11에서의 위치 권한 요청 화면이다.

항상 허용은 어디 갔나요?

  • Android 11에서는 즉시 '항상 허용' 옵션은 사용할 수 없다.
  • 대신 위에서 볼 수 있듯, 설정에서 액세스를 허용하세요.를 눌러서 설정 창에 가서 직접 허용 해야 '항상 허용'이 가능하다!
  • 이것 역시 사용자에게 더 많은 선택 권한을 준 것으로 볼 수 있다.
profile
developer

0개의 댓글