addProximityAlert ne fonctionne pas comme prévu

iOS sdk a de grandes fonctions de surveillance de région. J'ai besoin de quelque chose comme ça sur android et je pense que nous avons deux alternatives. Géoréférenceur et Localisateur.

Geofencing a vraiment des exemples bien rangés et des bogues , donc j'ai préféré LocationManager. Everting fonctionne bien dans le Gestionnaire D'emplacement sauf un. Si vous ajoutez votre emplacement actuel en tant que ProximityAlert, il déclenche immédiatement "entrée", mais c'est mon emplacement actuel , cela ne signifie pas que je suis entré dans cette région. En raison de cela, il déclenche "entrée" chaque fois que je commence ma demande si je suis dans la région.(Même si Je ne bouge pas)

comment résoudre ce problème et cet événement de feu seulement si l'utilisateur pénètre vraiment dans la région ?

Voici comment j'ajoute des PeddingIntents pour mes emplacements.

    LocationManager locationManager =  (LocationManager)mContext.getSystemService(Context.LOCATION_SERVICE);

    for(Place p : places)
    {
        Log.e("location", p.location);

        Bundle extras = new Bundle();
        extras.putString("name", p.displayName);
        extras.putString("id", p.id);
        Intent intent = new Intent(CommandTypes.PROX_ALERT_INTENT);
        intent.putExtra(CommandTypes.PROX_ALERT_INTENT, extras);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,Integer.parseInt(p.id), intent,PendingIntent.FLAG_CANCEL_CURRENT);
        float radius = 50f;
        locationManager.addProximityAlert(p.lat,
                p.lon, radius, 1000000, pendingIntent);

    }       

récepteur

public class ProximityReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    final String key = LocationManager.KEY_PROXIMITY_ENTERING;
    final Boolean entering = intent.getBooleanExtra(key, false);

    Bundle b = intent.getBundleExtra(CommandTypes.PROX_ALERT_INTENT);
    String id = b.getString("id");
    Log.e("here" + id, "here");

    if (entering) {
        Log.e(TAG,"entering");
    } else {
        Log.e(TAG,"leaving");
    }
} 

manifeste

   <receiver android:name=".ProximityReceiver">
        <intent-filter>
            <action android:name="ACTION_PROXIMITY_ALERT" />
        </intent-filter>            
    </receiver>

Merci beaucoup

PS: iOS n'a pas ce problème et leur documentation l'explique ainsi

la surveillance d'une région géographique commence immédiatement après l'enregistrement pour les applications autorisées. Cependant, ne vous attendez pas à recevoir un événement tout de suite. Seuls les passages frontaliers génèrent un événement. Ainsi, si au moment de l'inscription l'emplacement de l'utilisateur se trouve déjà dans la région, le gestionnaire d'emplacement ne génère pas automatiquement un événement. Au lieu de cela, votre application doit attendre que l'utilisateur traverser les limites de la région avant qu'un événement ne soit généré et envoyé au délégué. Cela dit, vous pouvez utiliser la méthode requestStateForRegion: de la classe CLLocationManager pour vérifier si l'utilisateur est déjà à l'intérieur de la limite d'une région.

3
demandé sur dracula 2013-12-06 16:11:48

1 réponses

EDIT: depuis que j'ai écrit ceci, il y a eu une nouvelle chose ajoutée à l'API geofence, "setInitialTrigger" qui allévate ceci:

https://developers.google.com/android/reference/com/google/android/gms/location/GeofencingRequest.Builder#setInitialTrigger%28int%29

Oui, c'est une nuisance, et c'est l'un des points majeurs où Android et IOS géofencing diffèrent, malheureusement.

alertes Android lorsque vous êtes à L'intérieur de la géofence si elle sait que vous étiez à l'extérieur avant ou vous avez ajouté la géofence à l'intérieur.

la façon dont je résous cela est avec un 'délai de Grâce' dans mon reciever d'émission. Fondamentalement, quand je crée la géofence, je stocke son temps de création dans des références partagées, et je vérifie contre cette valeur dans onReceive.

en faisant cela, tout résultat "immédiat" sera filtré. Peut-être 3 minutes, c'est trop long pour quelqu'un d'autre, mais cela fonctionne pour moi sur la base de la façon dont je travaille avec les barrières géographiques dans mon application.

private static final Long MIN_PROXALERT_INTERVAL = 18000l; // 3 mins in milliseconds

...

long geofenceCreationTime = session.getPrefs().getCurrentGeofenceCreation();
long elapsedSinceCreation = now - geofenceCreationTime;
if(elapsedSinceCreation < CREATIONTIME_GRACE_PERIOD){
        if (ApplicationSession.DEBUG) {
            Log.d(TAG, "elapsedSinceCreation;"+elapsedSinceCreation+";less than;"+CREATIONTIME_GRACE_PERIOD+";exiting");
        }
        return;

    }

J'espère que vous voyez où je veux en venir.

J'espère que ça aidera.

3
répondu Mathias 2016-02-06 11:36:03