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일 차 테스트 중이라 아직 확실한 결과를 도출하였다고 하기 힘들 것 같아, 이번 주 중으로 결과를 알게 되면 다시
수정해 보겠습니다.
'모바일 앱(안드로이드)' 카테고리의 다른 글
개발일기 #1 제목 정하기... (0) | 2022.10.03 |
---|---|
안드로이드 앱 만들기 : triggeringGeofences 가 뭐지 ( geoFenceing) (0) | 2022.09.27 |
안드로이드 앱 만들기 : json string을 kotlin 코드 변환 하기 (feat Plugin) (2) | 2022.09.19 |
안드로이드 앱 만들기 : Duplicate class androidx.lifecycle.ViewModelLazy 빌드 오류 대처 방법 (2) | 2022.09.17 |
안드로이드 앱 만들기 : 광고 ID 구현은 어떻게 ? (0) | 2022.09.15 |