2016-01-26 12 views
15

Mam problem ze zrozumieniem geofence w Androids.Jak zaimplementować "un-dwell" w geofence android?

rzeczywisty problem: Kiedyś Enter + Exit wydarzenia z gogli Geofence-API, ale na wielu urządzeniach sygnał jest tak niedokładne, że skacze i na zewnątrz ogrodzenia (skoki są większe niż promień 400m często).

Planowane rozwiązanie: Więc chcę użyć Dwell, aby "wygładzić" to. Jeśli lokalizacja utrzymuje się w ogrodzeniu przez minutę, dzieje się. Jak na razie dobrze. Ale jak wykryć przerwę na ogrodzenie? Kiedy używam Exit, może się zdarzyć kilka Exit z powodu tych sygnałów. To, czego potrzebuję, to rodzaj "niedostatku", kiedy opuszczam teren na dłużej niż minutę.

Chcę uniknąć ponownego wdrożenia całego Geofence za pomocą niestandardowej logiki, która rejestruje się w szybko powtarzających się lokalizacjach geograficznych i odfiltrowuje małe wartości odbiegające.

Pytanie: Czy jest coś w geofence-api, aby uzyskać "niezadowolenie"? Czy istnieje najlepsza praktyka, jak sprawdzić, czy Exit jest prawdziwym wyjściem?

+0

Hej, jak to się stało dla ciebie @Jens? – sirvon

+1

ponieważ jest wiele głosów w moim pytaniu, ale prawie żadna z odpowiedzi/sugestii Myślę, że nie istnieje coś nieodkrytego lub najlepszej praktyki. Co robię obecnie, to grać z dwoma podejściami: jeden jest, aby zaimplementować "niedobry", to znaczy: na-ZAKOŃCZ Rozpoczę okresową aktualizację lokalizacji i otrzymam 3 aktualizacje lokalizacji. Jeśli wszystkie 3 są nadal na zewnątrz, akceptuję je jako prawdziwe wyjście, a następnie usuń słuchacza. Drugim eksperymentem jest samodzielne ogrodzenie za pomocą funkcji LocationUpdates i samo wygładzenie (używając 3 lub nawet 5 lokalizacji, ignorując wartości odstające). – Jens

+0

Zastanawiam się, czy kiedykolwiek udało Ci się znaleźć rozwiązanie tego problemu, ponieważ jestem w tej chwili problem i naprawdę doceniam pomoc. – Haris

Odpowiedz

1
public long lastEnterTime = 0; 

    public void initTimer(){ 
     Timer timer = new Timer(); 
     timer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       if(lastEnterTime!=0 && System.currentTimeMillis() > lastEnterTime + 1000*60){ 
        lastEnterTime = System.currentTimeMillis(); 
        onRealEnter(); 
       } 
      } 
     },0,1000); 
    } 

    public void onRealEnter(){ 

    } 
    public void onEnter(){ 
     lastEnterTime = System.currentTimeMillis(); 
    } 

    public void onExit(){ 
     lastEnterTime = 0; 
    } 
+0

To Odpowiedź jest bardziej jak alternatywna realizacja dla "dwell", a nie "chybione". Również 1-sekundowy czas wydaje się gorszy niż inne obejścia (jak po prostu uruchomienie jednorazowego licznika czasu, aby ponownie sprawdzić, czy użytkownik naprawdę opuścił ogrodzenie). :( – Jens

1

W Google granic geograficznych, Wprowadź zdarzenie wyzwala za każdym razem wprowadzić Geofence, Wyjście zdarzenie wyzwala za każdym razem po przekroczeniu boundry z Geofence. Również zdarzenie Dwell wyzwala, gdy przebywasz wewnątrz strefy geofence przez określony czas.

W twoim przypadku, jeśli będziesz ciągle skakać i wchodzić w strefę geofence w mniej niż minutę, Dwell nigdy się nie wydarzy.

Jeśli wpiszesz Geofence, Wprowadź wyzwalaczy zdarzeń, a następnie zatrzymać wewnątrz przez jedną minutę lub więcej, Przerwa się stanie, a po Przerwa dzieje, jeśli zauważy się Exit zdarzenie, można użyj tego zdarzenia wyjścia jako prawdziwego wyjścia.

Uwaga: Możesz także zwiększyć promień geofence.

Mam nadzieję, że moja odpowiedź będzie dla ciebie jasna. :)

+0

To nie zadziała, ponieważ natychmiast wyjdziesz na Exit, a nie jak dwell.Tak jeśli użyjesz dwell + exit, wymyśl coś w stylu: (ignorowane enter) -> dwell-> exit -> (ignorowane enter) -> exit -> (ignorowane enter) -> exit -> (ignorowane enter) -> dwell-> exit – Jens

+0

W moim przypadku, nigdy nie zauważyłem żadnych skoków do iz ogrodzenia. Spróbuj sprawdzić API LocationServices. uzyskiwanie lokalizacji? Spróbuj uzyskać dokładniejszą lokalizację.Może to naprawić problem –

+0

Stworzyłem już testversion, czy dodałem 'requestLocationUpdates' z dużą dokładnością i interwał 30s, dodatkowy w stosunku do Geofences, co zwiększa dokładność, ale przynosi jeszcze więcej tych "skoków" Otrzymałem kilku użytkowników geologów, którzy nie przenieśli telefonu i dodałem te wartości z 30 na mapie Możesz zobaczyć 30 wartości wewnątrz ogrodzenia, a następnie 1 wartość 500 metrów od a następnie kolejne 30 wartości ponownie w środku.To dzieje się na wszystkich dostawców Obejście, które do tej pory znalazłem, to żądanie co kilka sekund pos i wygładzenie sygnału. To zabija baterię. – Jens

1

To tylko pomysł, ale dla każdego obszaru można było zarejestrować dwa geofencje o różnym promieniu. Zarejestruj się, aby wysłuchać DWELL dla geofence o mniejszym promieniu, a dla EXIT dla drugiego.

+0

Zdarzenie EXIT nadal stanowi problem, ponieważ natychmiast uruchamia się. To nie rozwiązałoby problemu "przeskakiwania". Ale to, co może działać w oparciu o tę ideę, byłoby zewnętrznym, wielkim ogrodzeniem, również słuchającym DWELL. Jeśli zewnętrzny DWELL jest uruchamiany, gdy wnętrze jest w stanie WYJŚCIA, oznacza to, że jesteś na zewnątrz. Wciąż są jednak 2 problemy. Jednym z nich jest to, że czas może być zły, a Ty po prostu skaczesz w mniejszym ogrodzeniu, gdy zajmujesz się ogrodzeniem zewnętrznym. Po drugie, nie znasz współczynnika aktualizacji, więc zewnętrzny płot powinien być tak duży, jak miasto lub kraj. – Jens

0

Możesz użyć numeru setNotificationResponsiveness, aby ustawić dłuższy czas powiadomienia, więc nie otrzymasz zdarzenia wyjścia, chyba że pozostanie ono naprawdę poza ogrodzeniem przez ten czas, więc skoki nie wywołają zdarzeń wyjściowych, jeśli wystąpią w ciągu tym razem

Powiązane problemy