1. GeoLocation
1. GeoLocation
1) 플랫폼 API에서 제공되는 시스템 서비스
val manager = getSystemService(LOCATION_SERVICE) as LocationManager
2) 폰에 어떤 위치정보 제공자(Location Provider)가 있는지 파악
// allProviders로 핸드폰의 모든 위치정보 제공자 목록을 받아옴
val providers = manager.allProviders
for (provider in providers) {
result += "$provider",
}
// getProviders(true)로 현재 이용 가능한 위치정보 제공자 목록을 받아옴
val enabledProviders = manager.getProviders(true)
for (provider in enabledProviders) {
result += "$provider",
}
3) 위치 정보 획득은 LocationManager의 getLastKnownLocation() 함수를 이용
val location: Location? = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
// LocationListener를 구현한 객체를 준비
val listener: LocationListener = object : LocationListener {
// 위치값 전달 위해 반복 콜 되는 함수
override fun onLocationChanged(location: Location) {
TODO("Not yet implemented")
}
// 프로바이더가 이용 불가능한 상황에 호출
override fun onProviderDisabled(provider: String) {
super.onProviderDisabled(provider)
}
// 프로바이더가 다시 이용 가능한 상황에 호출
override fun onProviderEnabled(provider: String) {
super.onProviderEnabled(provider)
}
}
// LocationManager에게 아래 함수의 매개변수로 위의 리스너 객체를 전달
// 매개변수인 리스너에게 반복적으로 함수를 호출하면서 위치 값을 제공
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10_000L, 10f, listener)
// 더이상 위치 값이 필요하지 않은 경우
manager.removeUpdates(listner)
1. Fused API
implementation 'com.google.android.gms:play-services:12.0.1'
2. Fused Location Provider
1) Fused Location Provider의 핵심 클래스
val connectionCallback = objedt: 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()
2) GoogleApiClient 객체에 위치 제공자를 판단
apiClient.connect()
3) 위치 획득
providerClient.getLastLocation().addOnSuccessListener(
this@FusedActivity,
object: OnSuccessListener<Location> {
override fun onSuccess(location: Location?) {
val latitude = location?.latitude
val longitude = location?.longitude
}
})
1. AndroidManifest.xml 설정
implementation 'com.google.android.gms:play-services:12.0.1'
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
// 개발자 사이트에서 얻어낸 맵키를 등록
<meta-data android:name="com.google.android.maps.v2.API_KEY"
android:value="~~~~"/>
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
2. 지도 layout 설정
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment" />
3. 지도 출력
override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
(supportFragmentManager.findFragmentById(R.id.mapView) as SupportMapFragment?)!!.getMapAsync(this)
}
override fun onMapReady(p0: GoogleMap?){
googleMap=p0
}