우찬쓰 개발블로그

안드로이드 GPS 및 주소값 가져오기 본문

안드로이드/안드로이드 개발

안드로이드 GPS 및 주소값 가져오기

이우찬 2019. 6. 26. 15:13
반응형

공공데이터 날씨 API를 연동하다보니 gps데이터 및 주소 데이터를 가져와야 하는 일이 생겼다.

 

관련 자료를 찾아보니 너무 다들 복잡하게 코드를 짜고 있어서 직접 GpsManager를 하나 만들어 보게 되었다.

 

먼저 유의해야할 점은, 안드로이드는 보통 Gps와 Wifi로 부터 위치 정보를 받아오는데, 안드로이드 기본 설정에서 위치 가져오기 모드가 Gps로만 되어있다면 네트워크로 부터 위치정보를 받아올수가 없다.

 

그래서 이 부분은 꼭 네트워크과 gps 둘 다로부터 위치정보를 가져오게 바꾸도록 하자.

 

그다음 GpsManager 소스이다.

 

/**
 * Created by WoochanLee on 2019-06-26.
 */
class GpsManager(val context: Context) {

    var location: Location? = null
    var address: String? = null
    private val geocoder = Geocoder(context, Locale.getDefault())

    init {
        initGpsCheck()
    }

    @SuppressLint("MissingPermission")
    fun initGpsCheck() {
        val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager

        val locationListener = object: LocationListener {
            override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {}
            override fun onProviderEnabled(provider: String?) {}
            override fun onProviderDisabled(provider: String?) {}
            override fun onLocationChanged(location: Location?) {
                this@GpsManager.location = location
                makeAddress()
            }
        }

        val networkLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
        if(networkLocation!=null) {
            location = networkLocation
            makeAddress()
        }

        val gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
        if(gpsLocation!=null) {
            location = gpsLocation
            makeAddress()
        }

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1f, locationListener)
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 1f, locationListener)
    }

    /**
     * 주소값 가져오기
     */
    private fun makeAddress() {
        try {
            address = geocoder.getFromLocation(
                location?.latitude?: (-1).toDouble(),
                location?.longitude?: (-1).toDouble(),
                1
            )[0].getAddressLine(0)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}

 

소스를 보면 알겠지만, 위치값을 가져오지 못한 경우는 null값을 가지고 있도록 하였다.

 

이전에 가지고 있는 gps정보가 있다면, getLastKnownLocaion 메소드로부터 gps값을 바로 받을 수 있다.

 

그리고 주소값이 변경될때마다 gps값을 받기위해서 onLocationChanged를 사용한다.

 

그리고 퍼미션 체크는 GpsManager에 두지 않았기 때문에 GpsManager를 생성하기전, Activity단에서 권한을 미리 허가받아야한다.

 

주소는 Geocoder를 사용하는데, 이 부분은 어떻게 설정하냐에 따라서 주소값의 종류가 틀려지니, 다르게 주소를 받고싶다면 관련 자료를 찾아보기 바란다.

반응형
Comments