LocationManager 를 통해 GPS, Network의 위치 정보를 얻을 수 있습니다. 위치 정보를 얻는 방법은 LocationManager.getLastKnownLocation() 으로 가장 마지막에 기록된 위치 정보를 가져오거나 LocationManager.requestLocationUpdates() 으로 Listener를 등록하여 위치가 변경될 때마다 이벤트를 받을 수 있습니다.
에뮬레이터 GPS 위치 설정
에뮬레이터 설정창에서 Location 부분에 먼저 Location 세팅을 해주어야 합니다.
랜덤한 곳을 누르고 save point를 누르면 위치를 저장할 수 있습니다.
이후 set Location 버튼을 누른뒤 에뮬레이터 설정창을 닫습니다.
에뮬레이터의 위치정보 갱신
이후 위치 정보를 갱신하기 위해서 LocationManager에 LocationListener를 구현한것과 다른 설정 변수들을 함께 넣어주어야 합니다.
private fun requestLocationUpdates() {
locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
locationListener = LocationListener { location ->
val latitude = location.latitude
val longitude = location.longitude
Log.d("activity", "latitude : $latitude, longitude : $longitude")
}
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
1000L,
10.0F,
locationListener
)
}
위의 코드에는 permission 구현부분이 빠져있지만, 직접 구현하시게 될때는 permission을 구현해 주셔야 합니다.
위에서 requestLocationUpdates 안에 전달해 주어야 하는 변수들은 다음과 같습니다.
- Provider: GPS_PROVIDER 또는 NETWORK_PROVIDER 가 될 수 있습니다.
- minInterval(ms) : 10초로 설정하면 업데이트가 있을 때 최소 10초 간격으로 이벤트를 전달합니다.
- minDistance(meters) : 설정된 거리만큼의 변화가 있을 때 이벤트를 전달합니다.
- Listener : Listener 객체를 전달합니다.
위의 메서드를 실행하게 되면 Listener안에 있는 latitude와 longitude에 값이 들어오게 됩니다.
GetLastKnownLocation을 통해서 좌표를 가져오기
위의 방법보다 더 쉬운방법은 getLastKnownLocation 메서드를 사용하는 방법입니다.
emulator 에서의 getLastKnownLocation 는 gps가 한번이라도 활성화 되면 가져올 수 있는 값입니다
즉, emulator에서 gps값을 가지고 오려면 최소한 requestLocationUpdate 를 먼저 실행 해 준뒤 getlastLocation 을 실행해 주어야 정상적으로 작동하게 되어있습니다.
이 방법의 단점은, 기기가 마지막으로 가지고 있는 위치가 현재 위치와 확연히 다를 수 있다는 점이 있습니다.
private fun getLastLocation() {
val location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
if (location != null) {
homeViewModel.setMyLocation(location.latitude, location.longitude)
}
}
위의 메서드들의 주의사항
GPS 위치 값 가져오기는 callBackListener 를 통해서 돌아옵니다, 또한 network 모듈보다 빠르게 동작합니다. 그렇기 때문에 현재 좌표를 통해서 api와 통신을 하게 되는 코드를 작성하신다면, 코드 작동 순서에 주의해야 합니다
최근댓글