Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

모바일 앱(안드로이드)

안드로이드 앱 만들기 : 지오펜싱 (Geofencing) 에 대한 이해

Billcorea 2022. 12. 8. 21:45
반응형

Geofencing (지오펜싱)

여러 번 지오펜싱에 대한 포스팅을 해 보았습니다. 이번에도 다시 이 포스팅을 하게 된 것은 지오펜싱에 대한 부족했던 이해를 추가로 적어 두고자 합니다. 

 

지오펜싱이 활용된 앱 샘플

적어 두고자 하는 내용은 지오펜싱을 하기 위해서 설정을 하기는 했어도 지오펜싱이 동작하지 않는 경우 때문입니다.

 

지오펜싱이 트리거 되지 않는다.

아래 이슈의 내용은 지오펜싱이 트리거 되지 않을 현상에 대한 이야기가 나와 있습니다.  앱을 구현하는 동안 GoogleMap이 표출된 상태에서는 지오펜싱 트리거가 잘 동작 합니다.  

 

https://issuetracker.google.com/issues/218335535

 

Google Issue Tracker

 

issuetracker.google.com

그러나 GoogleMap 이 살아 있지 못하는 경우 트리거가 되지 않는 현상이 발생하게 됩니다. 그래서 구글링을 해서 얻은 결론은 위 링크의 글에서 참고했습니다. 

 

LocationManager의 활용

아래 코드와 같이 locationManager을 이용해서 현재 위치를 받아오는 기능을 활성화하는 것입니다.  이렇게 하게 되면 사용자가 GoogleMap 을 열어 놓고 있지 않게 되어도 geofencing 이 trigger 되어 언제든 지 휴대장치의 위치 정보를 수집할 수 있게 됩니다.  

	val criteria = Criteria().apply {
            accuracy = Criteria.ACCURACY_FINE
            isAltitudeRequired = false
            isBearingRequired = false
            isSpeedRequired = false
            isCostAllowed = true
            powerRequirement = Criteria.POWER_LOW
        }

        lateinit var locationManager : LocationManager
        var locationProvider : String? = null

        val locationListener = object : LocationListener {
            override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {
                super.onStatusChanged(provider, status, extras)
                // provider의 상태가 변경될때마다 호출
                // deprecated
            }

            override fun onLocationChanged(location: Location) {
                // 위치 정보 전달 목적으로 호출(자동으로 호출)

                val longitude = location.longitude
                val latitude = location.latitude

                Log.d("Location", "Latitude : $latitude, Longitude : $longitude")
            }

            override fun onProviderEnabled(provider: String) {
                super.onProviderEnabled(provider)
                // provider가 사용 가능한 생태가 되는 순간 호출
            }

            override fun onProviderDisabled(provider: String) {
                super.onProviderDisabled(provider)
                // provider가 사용 불가능 상황이 되는 순간 호출
            }
        }
        
        ...

locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
locationProvider = locationManager.getBestProvider(criteria, true)

val location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)

if(location != null) {
    val accuracy = location.accuracy
    val latitude = location.latitude
    val longitude = location.longitude
}

// 매개변수로 위치 정보 제공자, LocationListener 호출 주기, 변경 위치 거리의 정보, LocationListener
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000
    , 100.0f, locationListener)

 

이제 위치 정보가 변하는 것을 이용해서 원하는 기능을 구현해 볼 수 있을 것 같습니다.  다음부터는 이런 기능 오류에 대한 대처는 잘 될 수 있을 것으로 생각됩니다.

 

 

 

 

반응형