2017-02-13 28 views
2

GeoFence вызывая вопроспродолжает Trigger GeoFence Event

У меня есть настройки Geofence в моем приложении, я использую IntetnService для события триггера ручки.

Моя проблема связана с событием триггера много раз.

Пусть я на 1 Местоположение внутри Geofence, к сожалению, некоторое время входа или выхода триггера события, Тогда я действительно хотел проверить geoEvent.getTriggerdLocation() свойства и проверить с гео радиусом забор,

если расположение триггера к географическому расстоянию загородки больше, чем радиус геосексуальности, а затем я освобожу свое функциональное событие выхода,

, но в конце концов событие триггера геоффенса 2 3 км далеко, даже я уже зашел в забор, и моя логика выше не будет. см оснастке

enter image description here

я хочу некоторые твердые исправления для них.

Место находится на с высоким приоритетом

это происходит больше, когда я буду вблизи границы забора

Добавить гео список забор, как сейчас я использую только один забор.

mGeofenceList.add(new Geofence.Builder().setRequestId(String.valueOf(loGeoFenceModels.liGeoFenceID)) 
        .setCircularRegion(loGeoFenceModels.ldGeoLatitude, loGeoFenceModels.ldGeoLongitude, 
          loGeoFenceModels.lfRadius) 
        .setExpirationDuration(Geofence.NEVER_EXPIRE) 
        .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) 
        .build()); 

PendidngIntentService

moGeofencePendingIntent = getGeofencePendingIntent(); 
     LocationServices.GeofencingApi 
       .addGeofences(moLocationClient, getGeofencingRequest(), moGeofencePendingIntent) 
       .setResultCallback(this); 

getGeofencingRequest() И moGeofencePendingIntent

private GeofencingRequest getGeofencingRequest() { 
    return new GeofencingRequest.Builder().setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER) 
      .addGeofences(mGeofenceList).build(); 
} 



private PendingIntent getGeofencePendingIntent() { 
    // Reuse the PendingIntent if we already have it. 
    if (moGeofencePendingIntent != null) { 
     return moGeofencePendingIntent; 
    } 

    Intent intent = new Intent(moContext, GeofenceTransitionsIntentService.class); 
    // We use FLAG_UPDATE_CURRENT so that we get the same pending intent 
    // back when calling addgeoFences() 
    return PendingIntent.getService(moContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
} 

GeofenceTransitionsIntentService.class

import java.util.ArrayList; 
import java.util.List; 
import com.google.android.gms.location.Geofence; 
import com.google.android.gms.location.GeofenceStatusCodes; 
import com.google.android.gms.location.GeofencingEvent; 
import android.R.bool; 
import android.app.IntentService; 
import android.app.usage.UsageEvents.Event; 
import android.content.Intent; 
import android.database.Cursor; 
import android.location.Location; 
import android.text.TextUtils; 

public class GeofenceTransitionsIntentService extends IntentService { 

protected static final String TAG = "GeofenceTransitionsIS"; 

public GeofenceTransitionsIntentService() { 
    super(TAG); // use TAG to name the IntentService worker thread 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
} 

private static String getGeofenceTransitionDetails(GeofencingEvent event) { 
    String transitionString = GeofenceStatusCodes.getStatusCodeString(event.getGeofenceTransition()); 
    List<String> triggeringIDs = new ArrayList<String>(); 
    for (Geofence geofence : event.getTriggeringGeofences()) { 
     triggeringIDs.add(geofence.getRequestId()); 
    } 
    return String.format("%s: %s", transitionString, TextUtils.join(", ", triggeringIDs)); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 

    GeofencingEvent event = GeofencingEvent.fromIntent(intent); 
    Log.i(TAG, "Geofencing Event : " + event); 
    if (event.hasError()) { 
     Log.i(TAG, "GeofencingEvent Error : " + event.getErrorCode()); 
     return; 
    } 

    // Get the type of transition (entry or exit) 
    if (event.getGeofenceTransition() == Geofence.GEOFENCE_TRANSITION_ENTER) { 
     Log.i(TAG, "GeofencingEvent Enter"); 
    } 
    if (event.getGeofenceTransition() == Geofence.GEOFENCE_TRANSITION_EXIT) { 
     Log.i(TAG, "GeofencingEvent Exit"); 
    ? 
    String description = getGeofenceTransitionDetails(event); 
    Log.i(TAG, "GeofencingEvent description : " + description); 
} 

}

Права доступа

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.hardware.location.gps" /> 

я застрял в этом вопросе, так как много дней, пожалуйста, помогите, чтобы закончить эту проблему.

+0

Опубликовать больше кода. –

+0

@kishorejethava это нормально? –

+0

Вы проверили идентификатор запроса Geofence? Возможно, что оба являются ИД запроса запроса. –

ответ

0

Нашел один патч, чтобы избежать нежелательных или фиктивных событий.

вы можете получить местоположение на время запуска

Location loTriggerGeoFenceLocation = moEvent.getTriggeringLocation(); 
long ldAccuracy = loTriggerGeoFenceLocation.getAccuracy(); 

теперь хранить ваши Геозоны расположение лат длинный и радиус. не получить триггер lat long и проверить расстояние между местоположением триггера и местоположением geo fence lat long. если расстояние меньше радиуса, оно должно быть входом, а расстояние больше, чем радиус. Это должно быть событие выхода

if (event.getGeofenceTransition() == Geofence.GEOFENCE_TRANSITION_EXIT) { 

    ldGeoLatLong = moSharedPreferenceManager.getGeoFenceTimeLocation(); 
    Location loExistGeoFenceLocation = new Location(""); 
    loExistGeoFenceLocation.setLatitude(ldGeoLatLong[0]); 
    loExistGeoFenceLocation.setLongitude(ldGeoLatLong[1]); 

    String lsRadius = moSharedPreferenceManager.getGeoFenceRadius(); 
    float lfRadius = Float.parseFloat(lsRadius); 
     Log.i(TAG, "GeofencingEvent Exit"); 
     float lfDistance = loTriggerGeoFenceLocation.distanceTo(loExistGeoFenceLocation); 
     if (lfDistance >= lfRadius && ldAccuracy <= 100f) { 
      moSharedPreferenceManager.setGeoFenceExit(true); 
     } 
} 
0

Вот очков вы должны иметь в виду при использовании Geofence в Application

От официального documentation

  • Выберите оптимальный радиус для геозоны

Для лучших результаты, минимальный радиус геозонности должен быть установлен от 100 до 150 метров. Когда Wi-Fi доступен, точность местоположения обычно составляет от 20 до 50 метров. Когда доступно место в помещении, диапазон точности может составлять всего 5 метров.Если вы не знаете, что в помещении находится , то местоположение можно установить в пределах геофунта, предположим, что местоположение Wi-Fi составляет около 50 метров.

Когда местоположение Wi-Fi недоступно (например, когда вы находитесь вождения в сельских районах), точность определения местоположения ухудшается. Точность диапазона может достигать нескольких сотен метров до нескольких километров. В подобных случаях вы должны создать геообъекты с большим радиусом.

  • Используйте тип задержки перехода для уменьшения тревоги спама

Если вы получаете большое количество предупреждений, когда на короткое время вождения мимо геозон, лучший способ уменьшить оповещения заключается в использовании перехода типа GEOFENCE_TRANSITION_DWELL вместо GEOFENCE_TRANSITION_ENTER. Таким образом, оповещение о проживании отправляется только , когда пользователь останавливается внутри геозоны в течение заданного периода времени. Вы можете выбрать продолжительность, установив задерживающуюся задержку.

+0

1. Выберите оптимальный радиус для вашего геофунта - он будет более 700 метров. 2.Используйте тип перехода на жительство, чтобы уменьшить спам предупреждения - Я знаю это, но я хочу эту функциональность для городской зоны. когда-то случается, когда пользователь не останавливается внутри ограждения, просто проходите через забор. –

+0

Вы пробовали радиус между 100 м до 300 м? потому что в моем случае я установил 200 м, так что он запускал около 5 м после 'Exit' или' Enter' –

+0

Buddy, в моем случае я уже в забор, и он вызовет событие выхода, даже я до сих пор (почти 200 измерительный прибор) из-за ограждения. –