원본출처: 티스토리 바로가기
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에서 퍼온 번역글입니다.
해서 나는 오늘도 지오펜싱에 대한 오해(?)를 하고 있었습니다. 위에서 기술된 소스는 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일 차 테스트 중이라 아직 확실한 결과를 도출하였다고 하기 힘들 것 같아, 이번 주 중으로 결과를 알게 되면 다시
수정해 보겠습니다.
댓글
댓글 쓰기