현재 위치에 대한 GPS 및 주소를 가져오는 예제를 간략하게 정리하려고 합니다.
1. 권한 설정
위치 정보를 가져오기 위해 가장 먼저 위치 관련 권한을 체크해야 합니다.
AndroidManifest.xml에서 권한을 추가해 줍니다.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
그리고 런타임에서의 권한 요청까지 메서드를 작성하고 MainActivity onCreate 에서 호출합니다.
private fun requestLocationPermission() {
try {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
|| ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this, arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
), 100
)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
requestLocationPermission() // 위치 권한 요청
...
}
앱 실행 시 아래와 같은 팝업창을 확인 할 수 있습니다.
2. 위치 가져오기
LocationManager를 활용해서 아래와 같이 위치 정보를 가져올 수 있습니다.
private fun getLocation(): Location? {
if (
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
) {
return null
}
val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
return locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
}
LocationManager에 대해 자세한 내용을 알고싶은 분을 위해 아래 링크로 남깁니다!
Android Developer : LocationManager
3. 주소 가져오기
Geocoder를 활용해서 아래와 같이 주소를 가져올 수 있습니다.
private fun getAddress(latitude: Double, longitude: Double): String {
val geocoder = Geocoder(this, Locale.getDefault())
val addresses: List<Address>? = try {
geocoder.getFromLocation(latitude, longitude, 5)
} catch (ioException: IOException) {
return "Error : Location service not available"
} catch (illegalArgumentException: IllegalArgumentException) {
return "Error : GPS values are incorrect"
}
if (addresses.isNullOrEmpty()) {
return "Error : Address not found"
}
val address = addresses[0]
return address.getAddressLine(0)
}
Geocoder에 대해 자세한 내용을 알고싶은 분을 위해 아래 링크로 남깁니다!
4. 테스트 결과
버튼을 클릭 했을 때 위도, 경도, 주소가 잘 출력되는지 확인해보려고 합니다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
requestLocationPermission() // 위치 권한 요청
binding.btnGetLocation.setOnClickListener {
val location = getLocation()
if (location != null) {
// 위치
binding.tvGPS.text = "${location.latitude}, ${location.longitude}"
// 주소
binding.tvAddress.text = getAddress(location.latitude, location.longitude)
}
}
}
실행결과는 아래와 같습니다.
0 comments: