안녕하세요.
구글맵 도움없이 그냥 위도와 경도만 얻어오는 방법을 알아볼게요
그냥 간단히 30분정도면 알아낼 수 있을 것 같아서 구글링 했는데 몇 시간을 소비했어요
왜 이렇게 다들 무언가 붙혀놨거나 다닥다닥 때어놔서 설명 해놨는지 참...
일단 위치정보를 사용해야 하기 때문에 매니페스트에 권한을 추가해줘요
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
activitiy_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:text="현재위치 가져오기"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/TV_Result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
/>
</LinearLayout>
MainActivity.kt
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.location.Location
import android.location.LocationListener
import android.location.LocationManager
import android.os.Build
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val lm = getSystemService(Context.LOCATION_SERVICE) as LocationManager
button?.setOnClickListener {
val isGPSEnabled: Boolean = lm.isProviderEnabled(LocationManager.GPS_PROVIDER)
val isNetworkEnabled: Boolean = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
//매니페스트에 권한이 추가되어 있다해도 여기서 다시 한번 확인해야함
if (Build.VERSION.SDK_INT >= 23 &&
ContextCompat.checkSelfPermission(applicationContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this@MainActivity, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 0)
} else {
when { //프로바이더 제공자 활성화 여부 체크
isNetworkEnabled -> {
val location =
lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER) //인터넷기반으로 위치를 찾음
getLongitude = location?.longitude!!
getLatitude = location.latitude
toast("현재위치를 불러옵니다.")
}
isGPSEnabled -> {
val location =
lm.getLastKnownLocation(LocationManager.GPS_PROVIDER) //GPS 기반으로 위치를 찾음
getLongitude = location?.longitude!!
getLatitude = location.latitude
toast("현재위치를 불러옵니다.")
}
else -> {
}
}
//몇초 간격과 몇미터를 이동했을시에 호출되는 부분 - 주기적으로 위치 업데이트를 하고 싶다면 사용
// ****주기적 업데이트를 사용하다가 사용안할시에는 반드시 해제 필요****
/*lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,
1000, //몇초
1F, //몇미터
gpsLocationListener)
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
1000,
1F,
gpsLocationListener)
//해제부분. 상황에 맞게 잘 구현하자
lm.removeUpdates(gpsLocationListener)*/
}
}
lm.removeUpdates(gpsLocationListener)
}
//위에 *몇초 간격과 몇미터를 이동했을시에 호출되는 부분* 에 필요한 정보
//주기적으로 위치 업데이트 안할거면 사용하지 않음
val gpsLocationListener = object : LocationListener {
override fun onLocationChanged(location: Location) {
val provider: String = location.provider
val longitude: Double = location.longitude
val latitude: Double = location.latitude
val altitude: Double = location.altitude
}
//아래 3개함수는 형식상 필수부분
override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
override fun onProviderEnabled(provider: String) {}
override fun onProviderDisabled(provider: String) {}
}
}
자세한 설명은 주석에 충분히 설명해놨어요
이렇게 간단한 것을 왜 이리 해맸는지...
'안드로이드 > 구현' 카테고리의 다른 글
코틀린 안드로이드 스튜디오 리사이클러뷰를 쉽게 이해해보자~ (0) | 2020.05.13 |
---|