【问题标题】:Android geofence transition triggersAndroid 地理围栏转换触发器
【发布时间】:2015-12-14 09:20:04
【问题描述】:

我正在构建一个包含谷歌地理围栏的应用程序,我使用 ENTER 和 EXIT 转换创建了该应用程序。 当打开“Location”时会出现问题,当在我的地理围栏内时,它会触发两个转换,而只有 ENTER 转换应该触发。 我将 ENTER 和 EXIT 都设置为 intitialTrigger()。

这怎么可能?

这是 google api 的错误还是我在构建器中做错了什么。提前致谢。

@Override
public void onResult(Result result) {
    Status s = result.getStatus();
    Log.d(TAG, "onResult(...)" + s.isSuccess());
    if (!s.isSuccess()) {
        Log.d(TAG, "statuskode = " + s.getStatusCode() +
                "  noget gik galt, sandsynlighvis blev gps slået fra = statuscode 1000");
    }
}

private GeofencingRequest createGeoFences() {
    return new GeofencingRequest.Builder()
            .addGeofence(geoFenceBuilder(Constants.LOCATION_BALLERUP, "ballerup_req_id"))
            .addGeofence(geoFenceBuilder(Constants.LOCATION_AALBORG, "aalborg_req_id"))
            .addGeofence(geoFenceBuilder(Constants.LOCATION_ESBJERG, "esbjerg_req_id"))
            .addGeofence(geoFenceBuilder(Constants.LOCATION_ÅRHUS, "århus_req_id"))
                    //  .addGeofence(geoFenceBuilder(Constants.LOCATION_TAASTRUP, 44))
            .setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER | GeofencingRequest.INITIAL_TRIGGER_EXIT)
            .build();
}

private Geofence geoFenceBuilder(LatLng location, String requestId) {

    return new Geofence.Builder().setCircularRegion(location.latitude, location.longitude, TARGET_RADIUS)
            .setExpirationDuration(Geofence.NEVER_EXPIRE)
            .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT)
            .setRequestId(requestId)
            .setNotificationResponsiveness(NOTIFICATION_DELAY)
            .build();
}

【问题讨论】:

    标签: android geofencing


    【解决方案1】:

    这可能是 Google 地理围栏 API 部分的一些奇怪错误。此外,将 ENTER 和 EXIT 事件作为初始触发器有点奇怪。这是动态调用setInitialTrigger() 的简单解决方案,并完全避免这种情况。在致电createGeoFences() 之前,获取一个 GPS 点并检查从该点到地理围栏中心点的距离。如果它在地理围栏之外,只需传递一个值将初始触发器设置为GEOFENCE_TRANSITION_ENTER,否则将其设置为GEOFENCE_TRANSITION_EXIT。

    至于为什么会这样,这是我的想法,虽然我没有测试过。 Google 可能会获取最后一个已知位置,最初可能在地理围栏之外,因此注册了GEOFENCE_TRANSITION_EXIT 事件。然后它会启动它的位置堆栈,看到手机实际上是在地理围栏内,然后注册GEOFENCE_TRANSITION_ENTER事件。

    【讨论】:

    • 嘿巴勃罗。一个很好的回答,我认为这听起来很可能是对错误触发的解释。您的建议也很好,尽管我最初不这样做的原因是;如果 google api 需要自定义处理,那么您也可以创建自己的地理围栏实现,我认为是这样。想要两个触发器也不是那么奇怪。想象一下,如果 GPS 在地理围栏内关闭,然后在围栏外重新打开。我仍然希望更新位置,这样我的服务器就不会认为我在地理围栏内。谢谢你的回复,很好。
    • 构建自己的地理围栏解决方案,在某种程度上可行并且保持低功耗是相当困难的。我是一个努力做到这一点的团队的一员。此外,奇怪的部分是将 ENTER 和 EXIT 都设置为初始触发器。没错,但我会让应用程序假设我们在地理围栏之外,除非我们明确告诉它我们已经进入了地理围栏。然后我们等待 EXIT 事件触发。希望您的应用一切顺利!编辑:仅供参考,我们的东西有效......不仅仅是在某种程度上。 :-)
    【解决方案2】:

    你需要注册一个可以处理触发器的 IntentService

    public class GeofenceTransitionsIntentService extends IntentService {
       ...
    protected void onHandleIntent(Intent intent) {
    
        GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);   
        // Get the transition type.
        int geofenceTransition = geofencingEvent.getGeofenceTransition();
    
        // Test that the reported transition was of interest.
        if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER ) {
            //TODO: on Transition Enter
        }else if(geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT){
            //TODO: on Transition Exit
        }else{
          Log.e(GEOFENCE, "Event not handled",
                    geofenceTransition));
        }
    

    在此解释:http://developer.android.com/training/location/geofencing.html

    如果您需要知道您是否在地理围栏内,您可以循环查看当前的地理围栏位置列表并检查其中一个是否足够接近以触发?

    类似这样的:

    public Location insideGeofenceLocation(Location currentLocation, ArrayList<Location> listOfGeofenceLocations, float triggerRadius) {
        for (Location geoFenceLocation : listOfGeofenceLocations) {
            if (currentLocation.distanceTo(geoFenceLocation) < triggerRadius)
                return geoFenceLocation;
        }
        return null;
    }
    

    查看当前位置:

    Location geofenceLocation = insideGeofenceLocation(locationClient.getLastLocation(), listOfGeofenceLocations, TARGET_RADIUS);
    if(geofenceLocation!=null){
        // TODO: update
    }
    

    【讨论】:

    • 感谢您的回答。也许我没有足够清楚地解释我的自我。问题是错误的转换触发,当在地理围栏内打开“位置”时,退出转换触发,只有输入转换应该触发......因此问题是,如何删除/解决错误的退出- 转换触发。
    • 听起来正确,如果您在地理围栏内,您只能触发退出或停留过渡。要触发进入过渡,您需要从外部过渡到地理围栏。
    猜你喜欢
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多