Android Location

노력을 즐겼던 사람·2020년 12월 10일
0

손자취 앱개발

목록 보기
4/4
post-thumbnail

손자취 어플개발에서 가장 핵심이 되는 기능은 동선 파악과 실내/실외 여부파악이다. 메인 로직을 구현하면서 Location에 대해서 열심히 공부했다. 까먹기전에 이를 정리하고자 한다.

위치 정보 얻기

많은 클래스가 존재한다. FusedLocationProviderClient, LocationServices, LocationManager, LocationListener 여러 클래스로 추상화가 잘 되어 있다. 하나씩 살펴보자

권한 요청

ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION 권한이 필요하다.
만약 NETWORK_PROVIDER를 사용하고 싶다면 둘 중 아무거나 사용하면 된다. 혹시 GPS_PROVIDER를 사용하고자 한다면 반드시 ACCESS_FINE_LOCATION을 사용해야한다.
이름에서 알 수 있듯이 ACCESS_FINE_LOCATION이 더 정확하다고 한다.

그리고 ActivityCompat.requestPermissions()을 활용해 사용자에게 권한을 허용 받아야한다.

Location Manager

말 그대로 위치 관리자이다. 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을 받아오는 것 뿐만 아니라 여러가지 기능들을 제공한다. 멤버 메소드들의 기능들은 공식문서를 참고하자

FusedLocationProviderClient

이름이 길기도하다. 이 녀석은 이름에 맞게 받기만 하는 녀석이다. LocationService와 함께 사용된다. 코드를 살펴보자.

FusedLocationProviderClient lpc = LocationServices.getFusedLocationProviderClient();
mFusedLocationClient.getLastLocation().addOnSuccessListner(location -> {
  latestLocation = new LatLng(location.getLatitude(), location.getLongtitude());
});

위와 같은 코드로 사용할 수 있다. LocationServices에 의해서 Client를 제공받고 Client는 가장 최신에 등록되어 있는 위치정보만 가져올 수 있다. 그렇기 때문에 최신에 등록되어 있는 위치 정보가 없을 수도 있다. 그저 받아오기만 하는 녀석...

우리 프로젝트에서는 원하는 파라미터를 설정한 후 LocationManger를 발행시키고 포그라운드 서비스에서 돌도록 만들어놨다. 이를 통해 앱을 실행하지 않고 걷는 도중에도 항상 위치 정보를 파악할 수 있게 됐다.

profile
노력하는 자는 즐기는 자를 이길 수 없다 를 알면서도 게으름에 지는 중

0개의 댓글