새끼 개발자의 Life is egg

[Android] 안드로이드 현재 위치 정보 가져오기. 마지막 위치 정보 말고 본문

개발's egg/Android

[Android] 안드로이드 현재 위치 정보 가져오기. 마지막 위치 정보 말고

현z 2023. 10. 12. 11:11

타사에서 만든 안드로이드 어플을 사용중인데 이런저런 이슈가 있다며 급하게 확인해달라는 요청이 들어왔다.

저는 웹...인데요...

 

자바와 xml로 만들어진 안드로이드 소스는 처음 봤는데

도대체 화면은 어디 있는거지? 하면서 여기저기 기웃댔다.

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

결국 안드로이드 스튜디오를 설치함

 


 

이슈 중 하나는 위치정보가 업데이트 되지 않는 것이었는데

위치 정보를 가져오는 부분을 보니 getLastLocation 메소드를 사용중이었다.

얘가 위치정보를 언제 업데이트하는지는 확실히 모르겠으나 서비스를 시작할 때 만든 위치 같았다. 

 

사용자가 작업을 시작할 때마다 위치를 새로 받아와야 할 필요가 있어서

getLastLocation 나 requestLocationUpdates 말고 getCurrentLocation 을 사용해야 할 것 같았다.

메서드 이름만 봐도 빼박인듯

 

안드로이드 개발자 문서를 보면

 

  • getLastLocation()은 위치 추정치를 더 빠르게 가져오고 앱의 배터리 사용량을 최소화합니다. 그러나 최근에 다른 클라이언트가 적극적으로 위치를 사용하지 않은 경우 위치 정보가 최신이 아닐 수 있습니다.
  • getCurrentLocation()은 더 최신 상태이고 정확한 위치를 더 일관되게 가져옵니다. 그러나 이 메서드를 사용하면 기기에서 활성 위치 계산이 발생할 수 있습니다.
    이 메서드는 가능한 경우 최신 위치를 가져오는 데 권장되는 방법이며 requestLocationUpdates()를 사용하여 직접 위치 업데이트를 시작하고 관리하는 것보다 안전합니다. 앱에서 requestLocationUpdates()를 호출하는 경우 위치를 사용할 수 없거나 최신 위치를 가져온 후 요청이 정확하게 중지되지 않으면 앱이 전력을 많이 소모할 수도 있습니다.

라고 나와있다.

 


 

lastLocation 이든 currentLocation 이든 가져오려면 FusedLocationProviderClient 인스턴스가 필요하다.

 

나처럼 getLastLocation 때문에 헤메이던 사람이라면 이미 만들어져 있겠지만

private FusedLocationProviderClient fusedLocationClient;

fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

LocationServices를 사용하여 생성해준다. (play-services-location 라이브러리)

자세한 사항은 안드로이드 개발자 문서를...

 

 

아래는 getCurrentLocation으로 바꾼 내용의 일부이다.

fusedLocationClient.getCurrentLocation(LocationRequest.PRIORITY_HIGH_ACCURACY, new CancellationToken() {
	@Override
	public boolean isCancellationRequested() {
		return false;
	}

	@NonNull
	@Override
	public CancellationToken onCanceledRequested(@NonNull OnTokenCanceledListener onTokenCanceledListener) {
		return null;
	}
}).addOnSuccessListener(this, location -> {
	if (location != null) {
		// ...	

		// location.getLatitude();
		// location.getLongitude();

	} else {
		// ...
	}
});

 

PRIORITY_HIGH_ACCURACY 는 int 타입이며 우선순위(정밀도)이다.

 

  • PRIORITY_BALANCED_POWER_ACCURACY - 이 설정을 사용하여 도시 블록 내의 위치 정밀도를 요청합니다. 정확성은 대략 100미터입니다. 이는 대략적인 수준의 정확성으로 간주되며 전력을 더 적게 소비할 수 있습니다. 이 설정을 사용하면 위치 서비스에서 Wi-Fi와 휴대폰 기지국 위치를 사용할 수 있습니다. 그러나 위치 정보 제공자의 선택은 사용할 수 있는 소스 등 다른 많은 요소에 따라 달라집니다.
  • PRIORITY_HIGH_ACCURACY - 이 설정을 사용하여 가장 정확한 위치를 요청합니다. 이 설정을 사용하면 위치 서비스가 GPS를 사용하여 위치를 확인할 가능성이 높습니다.
  • PRIORITY_LOW_POWER - 이 설정을 사용하여 도시 수준의 정밀도를 요청합니다. 대략 10킬로미터의 정확성입니다. 이는 대략적인 수준의 정확성으로 간주되며 전력을 더 적게 소비할 수 있습니다.
  • PRIORITY_NO_POWER - 전력 소비에 별다른 영향을 미치지 않으면서 사용 가능한 경우 위치 업데이트를 수신하려면 이 설정을 사용합니다. 이 설정을 사용하면 앱에서 위치 업데이트를 트리거하지 않고 다른 앱에서 트리거한 위치를 수신합니다.

addOnSuccessListener 의 location을 받아서 경위도를 확인할 수 있다.

 

 

 

참고.

https://developer.android.com/training/location

Comments