Триггеры перехода на геозону Android

Я создаю приложение, которое включает в себя геозоны Google, которые я создал с переходами ENTER и EXIT. Проблема возникает при включении "Местоположение", когда внутри моей геозоны запускаются оба перехода, тогда как должен запускаться только переход ENTER. Я установил оба параметра ENTER и EXIT как intitialTrigger().

Как такое возможно?

Это ошибка API Google или я сделал что-то не так в конструкторе. Заранее спасибо.

@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();
}

person Mads Gade    schedule 14.12.2015    source источник


Ответы (2)


Это может быть какая-то странная ошибка в части API Google Geofence. Кроме того, довольно странно иметь в качестве исходных триггеров как события ENTER, так и EXIT. Вот простое решение для динамического вызова setInitialTrigger() и полного предотвращения этого. Прежде чем позвонить createGeoFences(), получите точку GPS и проверьте расстояние от этой точки до центральной точки геозоны. Если он находится за пределами геозоны, просто передайте значение для установки начального триггера на GEOFENCE_TRANSITION_ENTER, в противном случае установите его на GEOFENCE_TRANSITION_EXIT.

Что касается того, почему он это делает, вот мои мысли по этому поводу, хотя я это не тестировал. Google может получать последнее известное местоположение, которое изначально могло находиться за пределами геозоны, таким образом регистрируя событие GEOFENCE_TRANSITION_EXIT. Затем он запустит свой стек местоположений, увидит, что телефон действительно находится внутри геозоны, а затем зарегистрирует событие GEOFENCE_TRANSITION_ENTER.

person Pablo Baxter    schedule 23.02.2016
comment
Привет, пабло. Хороший ответ, я думаю, он звучит как очень вероятное объяснение того ошибочного срабатывания. Ваше предложение тоже в порядке, хотя моя первоначальная причина не делать этого; если API Google требует индивидуальной обработки, вы также можете создать свою собственную реализацию геозоны, я так думаю. Также не так уж и странно хотеть оба триггера. Представьте, что GPS выключен внутри геозоны, а затем снова включен за пределами забора. Я все еще хочу обновить местоположение, чтобы мой сервер не считал меня внутри геозоны. Спасибо за ответ, он был хорош. - person Mads Gade; 24.02.2016
comment
Создать собственное решение для геозоны, которое в какой-то мере работает, но при этом остается малопотребляющим, довольно сложно. Я часть команды, которая стремилась именно к этому. Кроме того, странной частью было то, что в качестве начального триггера были установлены как ENTER, так и EXIT. Правильно, но я бы хотел, чтобы приложение предполагало, что мы находимся за пределами геозоны, если только мы явно не укажем, что вошли в геозону. Затем ждем триггера события EXIT. Надеюсь, с вашим приложением все идет хорошо! Изменить: FYI, наши вещи работают ... не только отчасти. :-) - person Pablo Baxter; 25.02.2016

Вам необходимо зарегистрировать 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
}
person TouchBoarder    schedule 14.12.2015
comment
спасибо за ответ. Возможно, я недостаточно ясно объяснил себя. Проблема в том, что срабатывает неправильный переход, так как при включении местоположения внутри геозоны срабатывает переход EXIT, когда должен срабатывать только переход ENTER ... Следовательно, проблема в том, как удалить / решить ложный переход EXIT срабатывание. - person Mads Gade; 14.12.2015
comment
Звучит правильно, если вы находитесь внутри геозоны, вы можете активировать только переход к выходу или задержке. Чтобы запустить переход входа, вам необходимо войти в геозону извне. - person TouchBoarder; 14.12.2015