안드로이드를 최근에 다시 공부 및 개발을 하고 입장에서 10년전과 많이 달라져 적응하기 어려움이 있다. 이번에 위치정보 기반 모듈 설계 및 구현 시 정리한 내용을 블로그로 재정리하려고 한다.
안드로이드의 위치서비스
안드로이드 어플리케이션은 기기의 여러 센서에서 제공하는 신호를 활용하여 기기 위치를 결정할 수 있다. 특히 사용자의 위치서비스를 제공하기 위해 GPS와 Network를 많이 사용하였다. LocationManager를 이용하여 GPS와 Network의 정보를 이용하여 현재 Location 정보를 얻어서 제공하였다. LocationManager 외에 구글은 Google I/O 2019에서 google-service를 이용하여 사용할 수 있는 FusedLocationProvider API를 발표했다.
https://www.youtube.com/watch?v=MEjFW_tLrFQ
FusedLocationProvider API가 제공된 이유를 생각해보면 개발자가 다양한 조건에서 위치 정보를 얻기 위해 신호를 조합하고 선택하는 것은 간단하지 않으며, 기기의 성능 및 효율적인 배터리 사용을 위한 솔루션을 선택하는 것도 어렵다. 기존에 LocationManager를 통해 제공되던 GPS와 Network를 이용한 위치정보는 정확도가 낮을 뿐만 아니라 정확도를 높히기 위해 배터리 소모도 많았다. 이러한 문제를 Google에서는 FusedLocationProvider를 이용하여 해결하였고, 위치정보 이용 시 해당 API를 사용하도록 권장하고 있다.
GPS와 Network를 이용한 위치정보 서비스가 왜 문제였는지에 대해 정리하고, LocationManager, FusedLocationProviderㅇ API의 사용법과, 어떤 차이가 있는지 정리해본다.
GPS, Network를 이용한 위치정보의 문제
GPS의 문제
위성신호를 이용한 GPS는 매우 좋은 위치정보를 제공한다. 하지만 단점이 있다면 위성신호를 받기 어려운 실내에서는 매우 낮은 정확도를 보여준다. 아래 표를 보면 사용자의 GPS를 이용한 위치정보는 야외에서는 매우 좋지만 실내로 들어갔을 시 정확도는 급격하게 하락한다. 왜냐면 실내에서는 GPS 신호가 차단되어 기기에서 GPS 신호를 받아 위치를 파악하기 어려워진다.
Network의 문제
GPS 신호를 이용하여 실내에서의 위치정보를 얻기 어려웠던 부분은 Wifi를 이용하여 해결을 하였다. 하지만 실외에서는 Wifi 신호가 잡기 어렵거나 잡히더라도 일정 지역을 벗어나면 다시 와이파이에 기기가 연결되기 전까지는 위치를 찾기 어렵다.
GPS & Network를 결합하여 문제해결?
GPS는 실내에서, Network는 실외에서 위치정보의 정확도 문제가 발생한다면, 두 개를 결합해서 사용하면 어떨까? 그러한 이유로 LocationManager를 이용하여 GPS-Provider와 Network-Provider를 이용하여 위치 정보를 얻었다. 하지만 이걸로 문제가 해결이 된 것일까?
두 개의 신호 중 정확도가 높을 신호를 파악하여 위치정보를 얻는다 하여도 항상 좋은 결과를 얻는 건 아니다. 특히 실내에서 실외로, 실외에서 실내로 이동하는 때에 그러한 문제가 발생했다. 아래 그림처럼 갭이 발생하게 되었고, 이런 갭을 보정하기 위해 가속도계, 자이로스코프등의 센서 데이터까지 활용하여 위치 정보를 계산하였다.
그렇게 발생한 gap을 보정하여 우측에 있는 것처럼 어떤 상황에서도 위치 정보를 정확하게 얻는 방법이 필요했고 그렇게 개발된 것이 FusedLocationProvider이다.
결국 다시 정리하면, 단일 정보가 아닌 여러 정보를 섞어서 정확한 위치를 가져오자! 라는 의미이다.
LocationManager
LocationManager는 안드로이드 위치서비스(Location Service)에 접근하기 위해 제공되는 클래스이다. 위치서비스는 디바이스의 위치 정보를 업데이트하거나 특정 위치에 가까워졌을 때 알림을 주거나 하는 용도로 사용될 수 있다.
FusedLocationProvider
FusedLocationProvider API (https://developers.google.com/location-context/fused-location-provider) 에 아래와 같이 API를 설명한다.
FusedLocationProvider는 앱에 필요한 위치 정보를 제공하기 위해 다양한 신호를 지능적으로 결합하는 Google Play 서비스의 위치 API
FusedLocationProvider는 GPS와 Network(Wi-Fi)와 같은 기본적인 위치 기술을 관리하고 필요한 서비스 품질을 지정하는 데 사용할 수 있는 간단한 API를 제공한다. 예를 들어, 사용 가능한 가장 정확한 데이터 또는 추가 전력 소비 없이 가능한 최고의 정확도를 요청할 수 있다.
아래 예시코드는 현재 위치를 FusedLocationProvider를 이용하여 얻어오는 예제이다.
정리
FusedLocationProvider와 LocationManager를 정리하고 FusedLocationProvider의 간단한 사용법을 정리해보았다. 구글은 위치정보에 접근할 때 안드로이드의 Location Service를 사용하지 않고 Google Play Service를 통해 제공하는 FusedLocationProvider의 사용을 권장 한다.
Reference
https://developers.google.com/location-context/fused-location-provider
https://developer.android.com/reference/kotlin/android/location/LocationManager
'Android > Component' 카테고리의 다른 글
[Android] Google Map Key 관리 (0) | 2022.08.16 |
---|---|
[Android] local.properties를 사용하여 키 관리하기 (2) | 2022.08.08 |
[Android Wear] Ambient Mode에서 Display 정보 업데이트하기 (0) | 2022.07.10 |
Application Foreground/Backgroud 상태 확인하기 (0) | 2022.06.13 |
[Android/Unity] Failed to install the following Android SDK packages as some licences have not been accepted. (0) | 2022.05.07 |