손자취 어플개발에서 가장 핵심이 되는 기능은 동선 파악과 실내/실외 여부파악이다. 메인 로직을 구현하면서 Location
에 대해서 열심히 공부했다. 까먹기전에 이를 정리하고자 한다.
많은 클래스가 존재한다. FusedLocationProviderClient
, LocationServices
, LocationManager
, LocationListener
여러 클래스로 추상화가 잘 되어 있다. 하나씩 살펴보자
ACCESS_COARSE_LOCATION
or ACCESS_FINE_LOCATION
권한이 필요하다.
만약 NETWORK_PROVIDER
를 사용하고 싶다면 둘 중 아무거나 사용하면 된다. 혹시 GPS_PROVIDER
를 사용하고자 한다면 반드시 ACCESS_FINE_LOCATION
을 사용해야한다.
이름에서 알 수 있듯이 ACCESS_FINE_LOCATION
이 더 정확하다고 한다.
그리고 ActivityCompat.requestPermissions()
을 활용해 사용자에게 권한을 허용 받아야한다.
말 그대로 위치 관리자이다. LocationManager
Provider
도 등록하고 LocationRequest
도 등록할 수 있고 위치수집 동작 기준을 설정할 수 있다. 예시 코드를 보자
LocationListener gpsListener = location -> {
// 위치 정보를 받을 때 마다 수행하고 싶은 로직
};
LocationManager = (LocationManager) getSystemService(Context.Location_SERVICE); // 인스턴스 생성
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, {location update 주기 (millisecond)}, {location update 거리 (m)}, gpsListener);
위와 같이 Listener
를 생성하고 Manager
에 등록하면 설정한 거리
, 주기
마다 Provider
에게 Location
을 받아온다.
Location
을 받아오는 것 뿐만 아니라 여러가지 기능들을 제공한다. 멤버 메소드들의 기능들은 공식문서를 참고하자
이름이 길기도하다. 이 녀석은 이름에 맞게 받기만 하는 녀석이다. LocationService
와 함께 사용된다. 코드를 살펴보자.
FusedLocationProviderClient lpc = LocationServices.getFusedLocationProviderClient();
mFusedLocationClient.getLastLocation().addOnSuccessListner(location -> {
latestLocation = new LatLng(location.getLatitude(), location.getLongtitude());
});
위와 같은 코드로 사용할 수 있다. LocationServices
에 의해서 Client
를 제공받고 Client
는 가장 최신에 등록되어 있는 위치정보만 가져올 수 있다. 그렇기 때문에 최신에 등록되어 있는 위치 정보가 없을 수도 있다. 그저 받아오기만 하는 녀석...
우리 프로젝트에서는 원하는 파라미터를 설정한 후 LocationManger
를 발행시키고 포그라운드 서비스에서 돌도록 만들어놨다. 이를 통해 앱을 실행하지 않고 걷는 도중에도 항상 위치 정보를 파악할 수 있게 됐다.