2017-07-18 2 views
0

Der Versuch, das Gerät zu überwachen, geben Sie den Geofence ein oder verlassen ihn. Aber manchmal empfängt es das Enter- oder Exit-Ereignis, selbst wenn sich das Gerät nicht bewegt. Code-Snippet sind unten.So erhalten Sie das genaue Geofencing-Ereignis

bemerkt auch nach der

lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); 

mit dem Geofence, dann in

void onLocationChanged(Location location) 

und verwenden die aktualisierte Position zu erstellen, den Abstand zwischen dem Ort für Geofence verwendet zu bekommen, scheint es auch ist nicht genau. Wenn Sie zum Beispiel nach dem Erstellen des Geofence aus Position 1 nur wenige Schritte entfernt sind, gibt onLocationChanged() die Position 2 zurück, und distanceTo() gibt mehr als 200 Meter zurück.

Auch bemerkt, auch das Gerät ist auf dem Tisch ohne zu bewegen, die onLocationChanged (Location location) gibt irgendwann verschiedene Standorte.

Ich denke, es hängt vielleicht vom Anbieter, aber der Test ist in WLAN abgedeckt. Vielleicht funktioniert es so.

Aber was, wenn es erforderlich ist, genauer oder granularer zu werden, gibt es eine andere oder bessere Möglichkeit, ein genaueres Geofence-Ereignis oder eine genaue aktuelle Position zu erhalten?

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())); 

nach dem Geofence erstellt wird, auch wird das Gerät auf dem Tisch, ohne Bewegung setzt, erhält er Geofence.GEOFENCE_TRANSITION_ENTER und Geofence.GEOFENCE_TRANSITION_EXIT in regelmäßigen Abständen. Manchmal bleibt es ohne Ereignis, aber es wird diese Ereignisse empfangen, wenn das Gerät ein wenig bewegt wird.

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); 
} 

Antwort

0

GPS-Signal variiert zwischen den Geräten und auch unterschiedlich verhalten, wenn Ihr Gerät das GPS-Signal schlecht ist (wenn Sie in einem Gebäude oder so ähnlich sind) würden Sie sehen, dass die die GPS-Position um springt und ist nicht Konstante. Derzeit gibt es keine gute Möglichkeit, in 100% der Fälle einen genauen Standort zu erhalten.

+0

Dank Sagi Mymon! Aber es könnte einen Weg geben, da einige Apps mit den LocationServices ziemlich zuverlässig funktionieren. Ich frage mich, ob jemand es wissen könnte. – lannyf

Verwandte Themen