2017-07-18 6 views
0

Si vous tentez de surveiller l'appareil, entrez ou sortez de la zone géographique. mais parfois il reçoit l'événement d'entrée ou de sortie même si l'appareil ne bouge pas. extrait de code sont ci-dessous.comment obtenir un événement de géolocalisation précise

aussi remarqué après avoir utilisé la

lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); 

pour créer le geofence, puis dans

void onLocationChanged(Location location) 

et utiliser l'emplacement mis à jour pour obtenir la distance entre l'endroit utilisé pour geofence, semble, il est également pas précis. Comme lorsqu'il a marché à quelques pas seulement après avoir créé la zone géographique à partir de l'emplacement n ° 1, onLocationChanged() renvoie l'emplacement n ° 2 et le retour distanceTo() indique plus de 200 mètres.

Également remarqué que même le périphérique est sur la table sans bouger, onLocationChanged (Location location) renvoie parfois des emplacements différents.

Je suppose que cela dépend du fournisseur, mais le test est dans la zone couverte par le wifi. Peut-être que c'est comme ça que ça fonctionne. Mais qu'en est-il s'il est nécessaire d'obtenir plus de précision ou de granularité, existe-t-il un moyen différent ou meilleur d'obtenir un événement d'geofence plus précis ou un emplacement actuel précis?

googleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); 
createGeofence(new LatLng(lastLocation.getLatitude(), lastLocation.getLongitude())); 

après la geofence est créé, même le dispositif est mis sur la table sans se déplacer, il reçoit Geofence.GEOFENCE_TRANSITION_ENTER et Geofence.GEOFENCE_TRANSITION_EXIT périodiquement. Parfois, il reste toujours sans événement, mais il recevra ces événements si légèrement déplacer l'appareil un peu.

private void createGeofence(LatLng latlng) { 
    GeofencingClient mGeofencingClient; mGeofencingClient = LocationServices.getGeofencingClient(this); 

     Geofence geofence = makeOneGeofence(GEOFENCE_REQUEST_ID, latlng, 150f); 
     GeofencingRequest geofenceRequest = createGeofenceRequest(geofence); 

     LocationServices.GeofencingApi.addGeofences(
       googleApiClient, 
       geofenceRequest, 
       getGeofencePendingIntent() 
     ).setResultCallback(this); 
} 

Geofence makeOneGeofence(String reqestId, LatLng latLng, float radius) { 
    return new Geofence.Builder() 
      .setRequestId(reqestId) 
      .setCircularRegion(
        latLng.latitude, 
        latLng.longitude, 
        radius //radius, meters 
      ).setExpirationDuration(60 * 60 * 1000) //1 hr 
      .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | 
        Geofence.GEOFENCE_TRANSITION_DWELL | 
        Geofence.GEOFENCE_TRANSITION_EXIT) 
      .setLoiteringDelay(500000) // 500 secs, after user enters a geofence if the user stays inside during this period of time 
      .build(); 
} 

private GeofencingRequest createGeofenceRequest(Geofence geofence) { 
    return new GeofencingRequest.Builder() 
      .setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER | GeofencingRequest.INITIAL_TRIGGER_DWELL) 
      .addGeofence(geofence) 
      .build(); 
} 

private final int GEOFENCE_REQUEST_CODE = 0; 
private PendingIntent getGeofencePendingIntent() { 

    if (mGeofencePendingIntent != null) 
     return mGeofencePendingIntent; 

    Intent intent = new Intent(this, GeofenceTransitionsIntentService.class); 
    return PendingIntent.getService(
      this, GEOFENCE_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
} 

Répondre

0

signal GPS varie entre les appareils et aussi se comporter différemment si est mauvais (si vous êtes à l'intérieur d'un bâtiment ou quelque chose comme ça) le signal GPS de votre appareil, vous verriez que la position GPS est sautiller et n'est pas constant. Actuellement, il n'y a pas de bon moyen d'obtenir une localisation précise dans 100% des cas.

+0

Merci Sagi Mymon! Mais il pourrait y avoir un moyen puisque certaines applications semblent fonctionner de manière assez fiable avec LocationServices. Je me demandais si quelqu'un pouvait le savoir. – lannyf