我正在构建一个包含谷歌地理围栏的应用程序,我用 ENTER 和退出过渡创建了这个应用程序。
转动" 位置"在我的地理围栏中,当只有ENTER转换应该触发时,它触发两个转换。
我已将 ENTER 和退出设置为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();
}
答案 0 :(得分:2)
这可能是Google Geofence API部分的一些奇怪错误。另外,将ENTER和EXIT事件都作为初始触发器是很奇怪的。这是动态调用setInitialTrigger()
的简单解决方案,并完全避免这种情况。在致电createGeoFences()
之前,获取GPS点并检查从该点到地理围栏中心点的距离。如果它在地理围栏之外,只需传递一个值将初始触发器设置为GEOFENCE_TRANSITION_ENTER
,否则,将其设置为GEOFENCE_TRANSITION_EXIT
。
至于它为什么这样做,这是我的想法,虽然我还没有测试过。 Google可能正在获取最后一个已知位置,该位置最初可能位于地理围栏之外,因此会注册GEOFENCE_TRANSITION_EXIT
事件。然后它将启动它的位置堆栈,看到手机实际上在地理围栏内,然后注册GEOFENCE_TRANSITION_ENTER
事件。
答案 1 :(得分:0)
您需要注册一个可以处理触发器的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
}