작성
·
1.5K
0
현재 레슨 위치 가져오기 - 메인 액티비티 지오코딩 (1) 에서
geoCoder.getFromLocation(latitude,longitude,7 )
를 그대로 사용하는데 에러가 뜹니다.
이 형식은 deprecated 됐다고 하고
getFromLocation(latitude: Double, longitude: Double, maxResults: Int, listener: Geocoder.GeocodeListener)
이걸 써야한다는데 GeocodeListener 를 어떻게 써야할지 감이 안옵니다. 구글에서도 찾기가 힘드네요.
어떤식으로 Geocodelistener 를 써야 할까요
답변 2
0
0
안녕하세요! 조이스입니다.
질문 주신 내용을 보면, 현재 버전이 변경되어 deprecated 된 함수를 사용하다가 나는 에러로 보이는데요, 말씀해주신 것처럼 GeocodeListener 를 구현해주시면 됩니다.
GeocodeListener 인터페이스는 onGeocode 함수를 구현해주면 됩니다. Geocode가 오는 것을 기다리고 있다가, Geocode를 받으면 onGeocode 함수를 실행하는 것이지요.
val geocodeListener = @RequiresApi(33) object : Geocoder.GeocodeListener {
override fun onGeocode(addresses: MutableList<Address>) {
// 주소 리스트를 가지고 할 것을 적어주면 됩니다.
}
}
혹은, 람다식을 사용하여 아래와 같이 적어주어도 됩니다.
val geocodeListener = Geocoder.GeocodeListener { addresses ->
// 주소 리스트를 가지고 할 것을 적어주면 됩니다.
}
자 그럼 MainActivity.kt 의 updateUI 함수의 수정된 전체 코드를 봐볼까요?
private fun updateUI() {
locationProvider = LocationProvider(this@MainActivity)
//위도와 경도 정보를 가져옵니다.
if (latitude == 0.0 || longitude == 0.0) {
latitude = locationProvider.getLocationLatitude()
longitude = locationProvider.getLocationLongitude()
}
if (latitude != 0.0 || longitude != 0.0) {
// [[[[[[[[[[[[[ 수정된 코드 시작]]]]]]]]]]]]]]]]]
//1. 현재 위치를 가져오고 UI 업데이트
//현재 위치를 가져오기
if (Build.VERSION.SDK_INT < 33) { // SDK 버전이 33보다 큰 경우에만 아래 함수를 씁니다.
val address = getCurrentAddress(latitude, longitude) //주소가 null 이 아닐 경우 UI 업데이트
address?.let {
binding.tvLocationTitle.text = "${it.thoroughfare}" // 예시: 역삼 1동
binding.tvLocationSubtitle.text =
"${it.countryName} ${it.adminArea}" // 예시 : 대한민국 서울특별시
}
}else { // SDK 버전이 33보다 크거나 같은 경우
val geocoder = Geocoder(this, Locale.getDefault())
var address: Address? = null
val geocodeListener = @RequiresApi(33) object : Geocoder.GeocodeListener {
override fun onGeocode(addresses: MutableList<Address>) {
// 주소 리스트를 가지고 할 것을 적어주면 됩니다.
address = addresses[0];
address?.let {
binding.tvLocationTitle.text = "${it.thoroughfare}" // 예시: 역삼 1동
binding.tvLocationSubtitle.text =
"${it.countryName} ${it.adminArea}" // 예시 : 대한민국 서울특별시
}
}
override fun onError(errorMessage: String?) {
address = null
Toast.makeText(this@MainActivity, "주소가 발견되지 않았습니다.", Toast.LENGTH_LONG).show()
}
}
geocoder.getFromLocation(latitude, longitude, 7, geocodeListener)
}
// [[[[[[[[[[[[[ 수정된 코드 끝]]]]]]]]]]]]]]]]]
//2. 현재 미세먼지 농도 가져오고 UI 업데이트
getAirQualityData(latitude, longitude)
} else {
Toast.makeText(
this@MainActivity, "위도, 경도 정보를 가져올 수 없었습니다. 새로고침을 눌러주세요.", Toast.LENGTH_LONG
).show()
}
}
위 코드의 수정된 부분을 보면 SDK 가 33 이상인 경우 GeocodeListener 를 먼저 구현해준 후 getFromLocation 함수를 실행해줍니다. 33 미만인 경우에는 기존 코드를 그대로 적어주면 됩니다.
열심히 수업을 들어주셔서 진심으로 감사드립니다 :)
추가적인 질문 있으시면 남겨주세요!
감사합니다!