안드로이드에서 지도는 필수 앱이다. 지도에서는 현재 사용자의 위치 권한을 얻는 것이 순서이기 때문에 사용자 위치 얻는 방법을 알아보자.
사용자의 위치를 추적하기 위해서는 총 3가지의 권한이 필요하다.
android_permission_ACCESS_COARSE_LOCATION
android_permission_ACCESS_FINE_LOCATION
android_permission_ACCESS_BACKGROUND_LOCATION
사용자의 위치를 얻는 방법으로는 LocationManger라는 시스템 서비스를 이용한다.
val manager = getSystemService(LOCATION_SERVICE) as LocationManager
위치를 어디서 받을지 위치 제공자를 지정하는데, GPS나 이동통신망, Wifi, Passive를 통해 위치를 받아올 수 있다.
result를 하나 선언하고 provider에 manager.allProviders를 호출하면 현재 기기에어떤 위치 제공자가 있는지 받을 수 있다.
현재 기기에 어떤 위치 제공자가 있는지를 알고 싶을 경우, LocationManager의 allProviders 프로퍼티 이용
var result = "All Providers : " val providers = manager.allProviders for(provider in providers) { result += "$providder." } Log.d("maptest", result)
현재 사용할 수 있는 위치 제공자를 알아보기 위한 getProviders() 함수 이용
result = "Enabled Providers : "
getAccuaracy() : 정확도
getLatitude() : 위도
getLongitude() : 경도
getTime() : 획득 시간
if(ContextCompat.checkSelfPermission (
this,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManger.PERMISSION_GRANTED
) {
val location : Location? = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
location?.let {
// 위도 받아오기
val latitude = location.latitude
// 경도 받아오기
val longiturde = location.longitude
// 정확도 받아오기
val accuracy = location.accuracy
// 획득 시간 받아오기
val time = location.time
Log.d("map_test", "$latitude, $location, $accuarcy, $time")
}
}
주기적으로 계속 위치를 가져와야 할 경우, LocationListener 이용
onLocationChanged( ) : 새로운 위치를 가져오면 호출
onProviderEnabled( ) : 위치 제공자가 이용할 수 있는 상황 시 호출
onProviderDisabled( ) : 위치 제공자가 이용할 수 없는 상황 시 호출
val listener : LocationListener = object : LocationListener {
override fun onLocationChanged(location : Location) {
Log.d("map_test", "${location.latitude), $(location.longitude), ${location.accuracy}")
}
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10_00L, 10f, listener)
manager.removeUpdates(listener)
}
구글 맵의 위치 라이브러리 서비스 사용 방법에 대해 정리해보자.
implementation 'com.google.android.gms:play-services:12.0.1'
val connectionCallback = object: GoogleApiClient.ConnectionCallbacks{
override fun onConnected(p0: Bundle?) {
// 위치 제공자를 사용할 수 있을 때
// 위치 획득
}
override fun onConnectionSuspended(p0: Int) {
// 위치 제공자를 사용할 수 없을 때
}
}
val onConnectionFailCallback = object : GoogleApiClient.OnConnectionFailedListener{
override fun onConnectionFailed(p0: ConnectionResult) {
// 사용할 수 있는 위치 제공자가 없을 때
}
}
val apiClient = GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(connectionCallback)
.addOnConnectionFailedListener(onConnectionFailCallback)
.build()
val providerClient = LocationService.getFusedLocationProviderClient(this)
appClient.connect()
onConnected() 함수에서 FusedLocationProviderClient의 getLastLocation() 함수를 호출해준다.
val connectionCallback = object: GoogleApiClient.ConnectionCallbacks{
override fun onConnected(p0: Bundle?) {
// 위치 제공자를 사용할 수 있을 때
// 위치 획득
}
override fun onConnectionSuspended(p0: Int) {
// 위치 제공자를 사용할 수 없을 때
}
}
val onConnectionFailCallback = object : GoogleApiClient.OnConnectionFailedListener{
override fun onConnectionFailed(p0: ConnectionResult) {
// 사용할 수 있는 위치 제공자가 없을 때
}
}
val apiClient = GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(connectionCallback)
.addOnConnectionFailedListener(onConnectionFailCallback)
.build()
위치 정확도에 대한 permission 및 인터넷 연결을 위한 permission을 추가해준다.
네이버 맵이나 카카오 맵 등 맵을 사용할 때 무조건 필요한 과정이다. 사이트에 나의 정보를 등록해 놓고 키를 발급받아 발급받은 키를 manifest 코드 안에 넣어야 맵을 구동시킬 수 있다!
(보라색 부분에 발급받은 키 값 입력)
id가 mapView인 fragment 하나만 설정해주면 된다.
mapView
프래그먼트를 만든 곳에 getMapAsync
해서 맵 연결을 시키면 연결 완료 시, Callback
을 걸었기 때문에 연결 완료 시 onMapReady
가 발생한다.
지도 중심을 이동하려며 위경도 좌표가 필요하다 ! 좌표를 잡고 줌레벨, 얼마나 확대할지를 설정하고 위에서 인자로 받은 구글맵을 가지고 moveCamera
라는 메소드를 이용해서 position
이동
맵 위에 아이콘을 올리는 마커를 만들 때는 icon
을 넣고 position
위치를 넣고 마커에 대한 title
, snippet
(간단한 설명)을 추가해준다.
현재 위치 받아오기를위해 locationRequest
를 통해 interval
을 1초
에 한번씩 받고 정확도를 설정해준 뒤 LocationCallback
을 설정해주면 내가 설정한 interval
만큼 위치 정보롤 전달해준다.