Today's

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

모바일 앱(안드로이드)

안드로이드 앱 만들기 : geofencePendingIntent 에 대한 고찰

Billcorea 2022. 9. 26. 22:42
반응형
private val geofencePendingIntent: PendingIntent by lazy {
    val intent = Intent(this, GeofenceBroadcastReceiver::class.java)
    intent.action = ACTION_GEOFENCE_EVENT
    PendingIntent.getBroadcast(this, 0, intent, FLAG_MUTABLE)
}

지오펜스는실제 지리적 영역에 대한 가상 경계 경계입니다.[1] 지오펜스는 동적으로 생성되거나(포인트 위치 주변의 반경에서와 같이) 미리 정의된 경계 세트(예: 스쿨 존 또는 이웃 경계)와 일치할 수 있습니다.

지오펜스의 사용은 지오펜싱이라고 하며 , 사용의 한 예는 지오펜스에 들어가거나 나가는 위치 기반 서비스 (LBS) 사용자의 위치 인식 장치를 포함합니다. 이 활동은 장치 사용자에 대한 경고와 지오펜스 운영자에게 메시지를 보낼 수 있습니다. 장치의 위치를 ​​포함할 수 있는 이 정보는 휴대폰 이나 이메일 계정으로 전송될 수 있습니다.

 

이 글은 https://en.wikipedia.org/wiki/Geo-fence에서 퍼온 번역글입니다. 

 

Geo-fence - Wikipedia

Virtual perimeter Two geofences defined in a GPS application A geofence is a virtual perimeter for a real-world geographic area.[1] A geofence could be dynamically generated (as in a radius around a point location) or match a predefined set of boundaries (

en.wikipedia.org

 

해서 나는 오늘도 지오펜싱에 대한 오해(?)를 하고 있었습니다.  위에서 기술된 소스는 geofence 수신을 설정하기 구현하는 예제를 android codelab에서 보면서 따라 하기를 하면서 구현한 소스이기도 합니다 

 

android 가 API 13을 위해서 퍼블리싱을 해야 하는 경우 경고를 날리는(?) 부분이 있습니다. 어디냐 하면 PendingIntent을 broadcast 하는 경우 따라가는 파라미터 중 FLAG_IMMUTABLE을 서술하라고 하는 경우 입니다. gradle build 을 하는 경우 에러 메시지가 나타나고 가이드 문구에 FLAG_IMMUTABLE 을 넣으라고 안내를 합니다. 

 

그래서 난 착하게(?) 그대로 따라 해 보았습니다.  그런데... 그것 때문인지 아직 잘 알지는 못하지만, 지오펜싱을 수신할 때

진입, 이탈하는 것을 결괏값으로 수신하여야 하나, 그것이 잘 되지 않는 문제가 발생했습니다.  아래 소스 예시 중에서  Geofence.GEOFENCE_TRANSITION_DWELL, GEOFENCE_TRANSITION_ENTER, GEOFENCE_TRANSITION_EXIT 등의 결과 구분을 못하는 경우를 말합니다. 그래서 구현하고자 했던 기능 구현이 어렵게 되는 현상이 있었습니다. 

 

<GeofenceBroadcastReceiver 소스의 일부 발췌>

override fun onReceive(context: Context, intent: Intent) {

    if (intent.action == ACTION_GEOFENCE_EVENT) {
        Log.e(TAG, "onReceive ...")

        val geofencingEvent = GeofencingEvent.fromIntent(intent)
        // Test that the reported transition was of interest.
        if (geofencingEvent != null) {

            if (geofencingEvent.hasError()) {
                val errorMessage = GeofenceStatusCodes.getStatusCodeString(geofencingEvent.errorCode)
                Log.e("GeofenceBR", errorMessage)
                return
            }

            when(val geofenceTransition = geofencingEvent.geofenceTransition) {
                Geofence.GEOFENCE_TRANSITION_DWELL -> {
                    if (context != null) {
                        sendNotification(context, "GeoFence Dwell")
                    }
                    Log.e(TAG, context.getString(R.string.DWell))
                }
                Geofence.GEOFENCE_TRANSITION_ENTER -> {
                    if (context != null) {
                        sendNotification(context, context.getString(R.string.Enter))
                    }
                    Log.e(TAG, "Entered")
                }
                Geofence.GEOFENCE_TRANSITION_EXIT -> {
                    if (context != null) {
                        sendNotification(context, context.getString(R.string.Exit))
                    }
                    Log.e(TAG, "Exit")
                }
                else -> {
                    if (context != null) {
                        sendNotification(context, "Geofence ${geofenceTransition.hashCode()}")
                    }
                    Log.e(TAG, "geofenceTransition = ${geofenceTransition.hashCode()}")
                }

            }
        } else {
            Log.e(TAG, "geofencingEvent is null...")
        }
    }
}

 

그래서 이런저런 검색을 하던 중에 FLAG_MUTABLE을 파라미터로 적용하는 것을 알려주는 stackoverflow.com의 게시글을 하나 발견했습니다.  해서 현재 구현된 앱을 이용하여 테스트를 진행해 보고 있습니다.

 

오늘이 1일 차 테스트 중이라 아직 확실한 결과를 도출하였다고 하기 힘들 것 같아, 이번 주 중으로 결과를 알게 되면 다시 

수정해 보겠습니다. 

반응형