2015-12-14 8 views
4

Я создаю приложение, которое включает в себя геологий googles, которые я создал с помощью обоих ENTER и EXIT переходов. Проблема возникает при повороте «Location», когда внутри моей геозоны он запускает оба перехода, когда должен запускаться только переход ENTER. Ive установить оба ENTER и EXIT как intitialTrigger().Триггеры перехода геофотографии Android

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

Это ошибка в 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(); 
} 

ответ

2

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

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

+1

Эй, пабло. Хороший ответ, я думаю, это похоже на очень вероятное объяснение этого ошибочного запуска. Ваше предложение также замечательно, хотя моя первоначальная причина не делать этого; если google api требует специальной обработки, тогда вы можете создать свою собственную реализацию геозонности, я так думаю. Также его не так странно хотеть оба триггера. Представьте себе, если gps повернут внутрь геозоны, а затем повернулся обратно за ограждение. Я все еще хочу, чтобы местоположение было обновлено, поэтому мой сервер не учитывает меня в геозонности. Thx для ответа это было хорошо. –

+0

Построение собственного решения для геосферы, которое несколько работает и остается низким, довольно сложно. Я часть команды, которая стремилась сделать именно это. Кроме того, странная часть имела как ENTER, так и EXIT, заданные как начальный триггер. Не ошибаюсь, но у меня было бы предположение, что мы находимся за пределами геозонности, если мы прямо не укажем, что мы ввели геофунданс. Затем мы ждем триггера события EXIT. Надеюсь, все будет хорошо для вашего приложения! Изменить: FYI, наши вещи работают ... не просто. :-) –

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 
} 
+2

THX для ответа. Возможно, я не объяснил, что я достаточно ясно. Проблема заключается в том, что неправильный переход срабатывает, как при повороте «местоположения» внутри геофунда, триггеры EXIT-перехода, когда должен запускаться только переход ENTER ... Следовательно, проблема заключается в том, как удалить/разрешить ложную Вывод EXIT-перехода. –

+0

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