我一直在尝试实现geofence来启动我的应用程序中的某个服务,虽然enter触发器起作用,但我似乎无法让exit触发器也正常工作。
private val geofencePendingIntent: PendingIntent by lazy {
val intent = Intent(this, GeofenceBroadcastReceiver::class.java)
intent.action = GEOFENCE
PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
}
private fun addGeoFence() {
val geoFenceRequest = getGeoFencingRequest()
checkOrAskLocationPermission {
geofencingClient.addGeofences(geoFenceRequest, geofencePendingIntent)
.addOnSuccessListener {
Log.d(TAG, "GeoFence Added")
}.addOnFailureListener {
Log.d(TAG, "GeoFence Failed to Add")
}
}
}
private fun getGeoFencingRequest(): GeofencingRequest {
val geoFence = Geofence.Builder()
.setRequestId(GEO_FENCING_REQUEST_CODE)
.setExpirationDuration(Geofence.NEVER_EXPIRE)
.setCircularRegion(
lat,
lng,
radius
)
.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_EXIT)
.build()
val geoFenceList: MutableList<Geofence> = mutableListOf(geoFence)
return GeofencingRequest.Builder().apply {
setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER or GeofencingRequest.INITIAL_TRIGGER_EXIT)
addGeofences(geoFenceList)
}.build()
}
这是接受器,我得在触发后做点什么
class GeofenceBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val geofencingEvent = GeofencingEvent.fromIntent(intent)
val geofenceTransition = geofencingEvent.geofenceTransition
context?.let {
if (intent?.action == Constants.GEOFENCE)
if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER) {
//Start
} else if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) {
//Stop
}
}
}
}
对于额外的上下文,我在firebase上设置了lat long,当我第一次用radius 100设置它们时,我看到了enter触发器,但是即使我将radius设置为1,它也永远不会触发退出,或者我真的必须带着设备本身移动到很远的地方?