북극곰의 개발일기

안드로이드에서 GPS 위치 구하기





posted by purplebeen on Sun Feb 04 2018 04:47:22 GMT+0900 (KST) in Android


안드로이드에서 GPS를 구해보자.

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

일단 GPS를 얻기 위해서는 android.permission.ACCESS_FINE_LOCATION 이라는 놈이 필요한데..

이 권한때문에 조금 코드가 더 복잡해졌다. 안드로이드 6.0 마시멜로우부터 권한 체크가 까다로워져서,

사용자가 동의를 하지 않으면 중요한 권한들은 사용하지 못하게 되었다.

권한관리를 보다 편리하게 하기 위해서 EasyPermission을 이용하였다.

build.gradle에 다음과 같은 구문을 추가해준다.

 implementation 'pub.devrel:easypermissions:1.1.3'

퍼미션이 요구될때 EasyPermission에게 넘겨주기 위해서 onRequestPermissionResult 메소드를 오버라이딩 한다.

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
       super.onRequestPermissionsResult(requestCode, permissions, grantResults)
       EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults)
}

그 후 필요에 따라 onPermissionDenied와 onPermissionGranted 메소드를 오버라이딩하여 작성한다.

반드시 오버라이딩 되야 한다.

    override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
        requestPermissions()
    }

    override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
//        updateLocation()
}
    lateinit var locationManager : LocationManager

    val mLocationListener: LocationListener = object : LocationListener {
        override fun onLocationChanged(location: Location) {
            lon = location.longitude
            lat = location.latitude
            Log.d("test", location.longitude.toString())
            call = weatherService.getWeather(lat, lon, "metric", "b1947fd3ccbca568608f4bd32ddfd5b4")
            loadData()
        }

        override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {
        }

        override fun onProviderEnabled(provider: String?) {
        }

        override fun onProviderDisabled(provider: String?) {
        }

}

GPS 정보를 가져오는데 사용되는 LocationManager의 선언부이다.

LocationListener에서 위치 변화가 감지된 onLocationChanged 메소드에서

latitude(위도) 와 lontitude(경도)를 구한 모습이다.

실질적으로 데이터를 구할때는

fun updateLocation() {
        if(EasyPermissions.hasPermissions(this@MainActivity, android.Manifest.permission.ACCESS_COARSE_LOCATION) &&
                EasyPermissions.hasPermissions(this@MainActivity, android.Manifest.permission.ACCESS_FINE_LOCATION)) {
            try {
                Log.d("test", "start")
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0.1f, mLocationListener)
            } catch (e : SecurityException) {
                Toast.makeText(applicationContext, "권한이 필요합니다!" , Toast.LENGTH_LONG).show()
                requestPermissions()
            }
        } else {
            requestPermissions()
        }
}

EasyPermission을 이용하여 권한을 갖고 있는지 체크한 뒤 권한이 있으면

LocationManager의 기본 GPS Provider를 이용하여 0초에 한번, 0.1f 이상 바뀔때마다 위치 변화를 감지한다.

이러한 방식으로 LocationManager를 이용해서 쉽게 현재 위치 좌표를 구할 수 있다.

링크는 LocationManager를 이용하여 현재 날씨를 불러오는 어플리케이션 예제이다.

누구게


!