인프런 커뮤니티 질문&답변

Jay Kim님의 프로필 이미지
Jay Kim

작성한 질문수

[2023 코틀린 강의 무료제공] 기초에서 수익 창출까지, 안드로이드 프로그래밍 A-Z

Geocoder getFromLocation 에러

작성

·

1.5K

0

현재 레슨 위치 가져오기 - 메인 액티비티 지오코딩 (1) 에서

geoCoder.getFromLocation(latitude,longitude,7 )

를 그대로 사용하는데 에러가 뜹니다.

이 형식은 deprecated 됐다고 하고

getFromLocation(latitude: Double, longitude: Double, maxResults: Int, listener: Geocoder.GeocodeListener)

 

이걸 써야한다는데 GeocodeListener 를 어떻게 써야할지 감이 안옵니다. 구글에서도 찾기가 힘드네요.

어떤식으로 Geocodelistener 를 써야 할까요

 

 

 

답변 2

0

getCurrentAddress 함수에있는내용같은데
updateUI 말고

getCurrentAddress 내용을 볼수있을가요?

0

Code With Joyce님의 프로필 이미지
Code With Joyce
지식공유자

안녕하세요! 조이스입니다.

 

질문 주신 내용을 보면, 현재 버전이 변경되어 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 미만인 경우에는 기존 코드를 그대로 적어주면 됩니다.

열심히 수업을 들어주셔서 진심으로 감사드립니다 :)

추가적인 질문 있으시면 남겨주세요!

Jay Kim님의 프로필 이미지
Jay Kim
질문자

감사합니다!

Jay Kim님의 프로필 이미지
Jay Kim

작성한 질문수

질문하기