이전에 안드로이드에서 위치정보를 얻어오는 방법에 관하여 말한적이 있습니다. 이때 얻어오는 위취정보는 Location class의 형태를 가지게 됩니다. Location class는 해당 위치에 대한 위도와 경도의 정보만 가지고 있기때문에 그곳이 어디인지 지명이 어디인지 알수 없습니다. 이때 사용하는 것이 Geocoder입니다.
Geocoder는 지리적 좌표(위도 및 경도)와 지명(주소) 간의 변환을 제공합니다.
이를 통해 애플리케이션은 주어진 위도와 경도에 대해 해당 위치의 지명을 얻을 수 있습니다.
이때 Geocoder는 사용시 주의할점이 있습니다.
해당 Geocoder는 인터넷을 통해 해당위치에 대한 정보를 가져오는 Api이기때문에 사용하기 전에 장치가 올바른 네트워크에 연결되어 있는지 확인해야 합니다. 또한 기기에서 지오커더가 구현이 되어있지 않을경우 Geocoder를 사용할수 없기에 isPresent()로 검사후 Geocoder사용해야합니다.
Geocoder를 통해 변환하여 얻게되 지명에대한 정보는 Address라는 클래스의 형태를 가집니다
countryName
주소의 국가 이름을 나타냅니다.
adminArea
주소의 행정 구역 이름을 나타냅니다. 예를 들어, 미국의 경우 주 이름(미 주)이 될 수 있습니다.
subAdminArea
보조 행정 구역 이름을 나타냅니다. 예를 들어, 캘리포니아 주의 경우 군 이름이 될 수 있습니다.
locality
지역 또는 도시의 이름을 나타냅니다.
subLocality
보조 지역 또는 도시의 이름을 나타냅니다. 일부 지역에서는 이 값이 존재하지 않을 수 있습니다.
thoroughfare
도로의 이름을 나타냅니다. 주소가 도로의 한 부분인 경우 이 속성을 사용하여 도로명을 얻을 수 있습니다.
subThoroughfare
도로의 보조 이름 또는 번지수를 나타냅니다.
featureName
건물이나 장소의 이름을 나타냅니다. 예를 들어, 쇼핑몰의 이름 또는 공공 시설의 이름이 될 수 있습니다.
postalCode
우편번호를 나타냅니다.
phone
전화번호를 나타냅니다.
latitude
주소의 위도를 나타냅니다.
longitude
주소의 경도를 나타냅니다.
getFromLocation(double latitude, double longitude, int maxResults)는 API level 33부터 deprecated되었으며 API level 33(TIRAMISU)부터는 getFromLocation(double latitude, double longitude, int maxResults, Geocoder.GeocodeListener listener)을 사용해야합니다.
getFromLocationName(String locationName, int maxResults)또한 API level 33부터 deprecated되었으며 API level 33(TIRAMISU)부터는 getFromLocationName(String locationName, int maxResults, Geocoder.GeocodeListener listener)을 사용해야합니다.
class MyGeocoder(context: Context, private val myGeocoderListener: MyGeocoderListener) {
private val geocoder: Geocoder? by lazy {
if (Geocoder.isPresent()) {
Geocoder(context, Locale.KOREA)
} else {
null
}
}
interface MyGeocoderListener {
fun sendAddress(address: Address)
}
fun getAddressToLocation(location: Location) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
geocoder?.getFromLocation(
location.latitude,
location.longitude,
1
) { address: List<Address> ->
myGeocoderListener.sendAddress(address[0])
}
} else {
val address: Address? =
geocoder?.getFromLocation(location.latitude, location.longitude, 1)?.get(0)
if (address != null) {
myGeocoderListener.sendAddress(address)
}
}
}
fun getAddressToStr(str: String) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
geocoder?.getFromLocationName(
str,
1
) { address: List<Address> ->
myGeocoderListener.sendAddress(address[0])
}
} else {
val address: Address? =
geocoder?.getFromLocationName(str, 1)?.get(0)
if (address != null) {
myGeocoderListener.sendAddress(address)
}
}
}
}
reference
https://developer.android.com/reference/android/location/Address
https://developer.android.com/reference/android/location/Geocoder
잘 읽었습니다!