代码之家  ›  专栏  ›  技术社区  ›  Mahmoud Omara

Android地理围栏退出触发器

  •  0
  • Mahmoud Omara  · 技术社区  · 4 年前

    我一直在尝试实现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,它也永远不会触发退出,或者我真的必须带着设备本身移动到很远的地方?

    0 回复  |  直到 4 年前