Android 11 버전 여러 업데이트 사항 중 개인정보 보호기능에서 크게 달라졌다는 글을 보았다.
곧 Android 12가 출시 되겠지만 그래도...
여러 프로젝트를 해보면서 지도에서 사용자 위치 접근에 대한 퍼미션을 많이 다뤘었다.
근데 정작 허용 여부를 물어보고 허용/비허용에 따른 동작만 다루었을 뿐, 허용에 대한 상세적인 이야기를 다뤄본 적이 없다.
그래서 Android에서의 위치 권한을 이번 글에서 다루고자 한다.
안드로이드 6,10,11 위치 권한 변경
위 글에서 충분히 자세히 설명을 해주시고 있고 난 여기에 덧붙여 설명하려 한다.
우선 위치 권한 퍼미션의 역사를 살펴보면
크게 Android 6.0 이전과 이후로 나눠진다.
Android 6.0 이전에는 앱에서 필요한 권한을 사용자로부터 요구할 때 어플을 설치할 때 요구하였다.
Android 6.0 부터는 앱에서 필요한 권한이 있을 때 사용자로부터 권한을 그때 받게 되었다.
즉, 위치 권한이 필요한 시점에 사용자에게 요청할 수 있었다.
<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 26에서는 위치 권한 변경 사항이라기보단 백그라운드 위치 제한을 두게 된다!
공식문서 say
기기 성능 개선을 위해 포그라운드 실행 중이지 않은 앱의 특정 동작을 제한한다.
startService()
를 사용하여 백그라운드 서비스 생성이 허용되지 않은 시점에 접근하려 할 경우 illegalStateException을 발생시킨다고 한다.위치 권한 설정 여부와 관계없지만 Android 8에서 나타난 백그라운드 접근 제한을 시작으로 10부터는 백그라운드 위치 접근을 아예 분리시켜 놓게 된다!
이야기의 흐름 맥락 상 알고있으면 좋을 내용이다.
Android 10에서는 백그라운드 위치 권한과 포그라운드 위치 권한으로 나뉘었다.
백그라운 위치 권한 - 화면이 보이지 않지만 위치는 체크 하고 있는
포그라운 위치 권한 - 앱의 화면이 보이는 상태에서 위치를 체크하게 되는
그래서 백그라운드 위치 권한 요청을 하려면 Manifest에 한 가지 더 추가해줘야 한다.
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
이렇게 지정해두게 된다면 권한 허용 여부를 물어보는 과정에서 Android 6과는 다르게 나타난다.
위의 사진에서 볼 수 있듯 3가지의 경우로 분기 처리가 된다.
그렇다면 기존에 Android 6 이후에 Background 위치 권한 요청을 하지 않는다면 무슨 일이 일어날까?
여러 영향을 생각해봐야 OS 버전 업데이트를 하더라도 어플 문제가 없지 않을까?
역시나 정리를 해주신 분들이 있다 Android Q 새로운 위치 접근
위 글이 원문이다.
1️⃣ 사용자가 앱을 사용하는 동안에만 위치 정보를 확인하는 경우
2️⃣ 앱이 포그라운드 서비스를 통해 빈번하게 사용자 위치 정보를 확인하는 경우
3️⃣ 앱이 백그라운드에서 위치 정보를 확인하는 경우
백그라운드 정책 관련하여 더 궁금하다면 공식 문서를 살펴보자.
(개인적으로는 백그라운드 위치 접근에 대해 아주 많~이 제한,제약을 두려고 하는 것 같다)
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);
}
Android11에서는 사용자가 선택할 수 있는 위치 권한 옵션이 더 세분화 되었다. 😂
앞서 살펴보았듯
Android 10에서는 [항상 허용, 앱 사용중만 허용, 거부] 이렇게 3가지가 있었다.
Android 11에서는 [항상 허용, 앱 사용중만 허용, 이번만 허용, 거부] 이렇게 4가지로 나누어지게 되었다.
Android 11에서의 위치 권한 요청 화면이다.