본문 바로가기
Android

[Doit 깡샘의 안드로이드 앱 프로그래밍 with 코틀린] 정리 19 - 구글 Play 서비스의 위치 라이브러리

by 들풀민들레 2022. 2. 28.
본 글은 [Doit 깡샘의 안드로이드 앱 프로그래밍 with 코틀린 - 이지스퍼블리싱 (2022)] 의 내용을 발췌한 것입니다.

좀더 자세한 내용은 책 혹은 인강을 통해 확인해 주세요.

 

 

 

앞에서 살펴본 것처럼 앱에서 사용자의 위치를 얻을 때는 여러 가지 상황을 고려해 적절한 위치 제공자를 지정하는 일이 무엇보다 중요합니다. 이때 고려할 사항을 정리하면 다음과 같습니다.


• 전력을 적게 소비하는가?
• 정확도는 높은가?
• API가 간단한가?
• 부가 기능을 제공하는가?
• 대부분 안드로이드 기기를 지원하는가?


이처럼 고려할 사항이 많다 보니 자연스럽게 개발 과정이 복잡해집니다. 그래서 구글에서는 최적의 알고리즘으로 위치 제공자를 지정할 수 있도록 Fused Location Provider라는 라이브러리를 제공합니다.


먼저 Fused Location Provider를 이용하려면 빌드 그래들의 dependencies 항목에 다음처럼 구글의 play-services 라이브러리를 선언해야 합니다.

 

implementation 'com.google.android.gms:play-services:12.0.1'

Fused Location Provider에서 핵심 클래스는 다음 2가지입니다.
• FusedLocationProviderClient: 위치 정보를 얻습니다.
• GoogleApiClient: 위치 제공자 준비 등 다양한 콜백을 제공합니다.

 

GoogleApiClient에서 위치 정보 제공자를 결정하면 이를 이용해서 FusedLocationProvider Client에서 위치를 가져오는 구조입니다. 우선 두 클래스를 초기화해야 하는데, GoogleApi Client에서는 GoogleApiClient.ConnectionCallbacks와 GoogleApiClient.OnConnection FailedListener 인터페이스를 구현한 객체를 지정해야 합니다.

 

val connectionCallback=object: GoogleApiClient.ConnectionCallbacks {
    override fun onConnected(p0: Bundle?) {
        // 위치 제공자를 사용할 수 있을 때
        // 위치 획득
    }
    override fun onConnectionSuspended(p0: Int) {
    	// 위치 제공자를 사용할 수 없을 때
    }
}
val onConnectionFailedCallback = object : GoogleApiClient
	.OnConnectionFailedListener {
    override fun onConnectionFailed(p0: ConnectionResult) {
    	// 사용할 수 있는 위치 제공자가 없을 때
    }
}
val apiClient: GoogleApiClient = GoogleApiClient.Builder(this)
    .addApi(LocationServices.API)
    .addConnectionCallbacks(connectionCallback)
    .addOnConnectionFailedListener(onConnectionFailedCallback)
    .build()

 

GoogleApiClient.Builder의 addConnectionCallbacks() 함수에 GoogleApiClient.ConnectionCallbacks 인터페이스를 구현한 객체를 지정하면 위치 제공자를 사용할 수 있을 때 onConnected() 함수가 자동으로 호출됩니다. 그러면 onConnected() 함수에서 위치를 가져오면 됩니다. 만약 위치 제공자가 어느 순간에 사용할 수 없게 되면 onConnectionSuspended() 함수가 자동으로 호출됩니다.


GoogleApiClient.Builder의 addOnConnectionFailedListener() 함수에 GoogleApiClient.OnConnectionFailedListener 인터페이스를 구현한 객체를 지정하면 사용할 수 있는 위치 제공자가 없을 때 onConnectionFailed() 함수가 자동으로 호출됩니다.


FusedLocationProviderClient는 다음처럼 초기화합니다.

 

val providerClient: FusedLocationProviderClient =
	LocationServices.getFusedLocationProviderClient(this)

GoogleApiClient와 FusedLocationProviderClient를 초기화했다면 이제 위치를 가져와야 하는데, 그러려면 먼저 GoogleApiClient 객체에 위치 제공자를 요청해야 합니다.

 

apiClient.connect()

GoogleApiClient의 connect() 함수를 호출하면 여러 가지 상황을 고려해 가장 알맞은 위치 제공자를 선택한 다음 onConnected() 함수를 호출해 줍니다. 따라서 onConnected() 함수에서 다음처럼 FusedLocationProviderClient의 getLastLocation() 함수만 호출해주면 됩니다. 이 함수는 앱에서 마지막으로 알려진 사용자 기기의 위치를 요청합니다.