2013-06-11 8 views
5

Ich habe begonnen, auf Android mit letzten Location Services Feature zu entwickeln: Geofences !! Gibt es ein bekanntes Problem mit einem falschen Standortanbieter? Folgendes Beispiel hier (https://developer.android.com/training/location/geofencing.html): Mein Vorsatzdienst wurde nie ausgelöst, selbst wenn der aktuelle Standort im Geofence liegt. Ich benutze FakeGPS Android App als Mock Location Provider und wenn ich eine Route simuliere sehe ich die Standortänderungen in der Google Maps App, so dass der Mock Location Provider gut funktioniert. Irgendwelche Ideen ?Android Geofence mit Mock Location Provider

Danke. Paolo.

Antwort

3

Ich habe immer versucht, dies zur Arbeit zu bringen. Was für ein Schmerz Google! Da es heißt, Geofences können leicht mit Mocks getestet werden.

Der Zaubertrick besteht darin, den Providernamen "Netzwerk" in dem an setMockLocation übergebenen Standort zu verwenden.

Location location = new Location("network"); 
    location.setLatitude(latitude); 
    location.setLongitude(longitude); 
    location.setTime(new Date().getTime()); 
    location.setAccuracy(3.0f); 
    location.setElapsedRealtimeNanos(System.nanoTime()); 

    LocationServices.FusedLocationApi.setMockLocation(_googleApiClient, location); 
+2

Don müssen Sie zuerst LocationServices.FusedLocationApi.setMockMode (_googleApiClient, true) aufrufen? –

+0

Haben Sie einen Link, der zeigt, dass LocationServices.GeofencingApi LocationServices.FusedLocationApi tatsächlich zum Spotten verwendet? Ich habe keinen Beweis dafür gesehen, dass es wahr ist. – yiati

0

Stellen Sie sicher, dass sich falsche Standorte auf Ihrem Telefon befinden. Wählen Sie Einstellungen -> Entwickleroptionen -> "Scheinziele zulassen".

0

LocationServices.FusedLocationApi.setMockMode (googleApiClient, true) verwenden müssen bevor Sie Mock Ort verwendet werden muss.

1

Eigentlich Intent-Dienst in dem genannten Beispiel funktioniert gut, wenn Ihre App im Vordergrund ist, aber wenn die App im Hintergrund ist, wird dieser IntentService nie aufgerufen. So müssen wir Broadcast-Empfänger statt Intent-Dienst verwenden.

Ich fand diesen Blog hilfreich bei der Lösung.

http://davehiren.blogspot.in/2015/01/android-geofence-stop-getting.html

+0

Ein Link zu einer Lösung ist willkommen, aber stellen Sie bitte sicher, dass Ihre Antwort ohne sie nützlich ist: [Fügen Sie einen Kontext um den Link hinzu] (// meta.stackexchange.com/a/8259), damit Ihre Mitbenutzer eine Idee haben, was es ist und warum es dort ist, zitieren Sie dann den relevantesten Teil der Seite, auf den Sie verlinken, falls die Zielseite nicht verfügbar ist. [Antworten, die etwas mehr als ein Link sind, können gelöscht werden.] (// stackoverflow.com/help/deleted-answers) –

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzubeziehen und bereitzustellen der Link als Referenz. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/15725231) – Serenity

+0

Sie sollten die Antwort nicht ablehnen, es sei denn, Sie haben ein klares Verständnis der Frage und ihrer Lösung. @Serenity –

1

Sie Rundfunkempfänger statt Aktivität wie dieses

public class GeofenceReceiver extends BroadcastReceiver 
implements 
    GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, 
    ResultCallback<Status>{ 

GoogleApiClient mGoogleApiClient; 
PendingIntent mGeofencePendingIntent ; 
Context mContext; 

@Override 
public void onReceive(Context context, Intent intent) { 
    mContext = context; 
    mGoogleApiClient = new GoogleApiClient.Builder(mContext) 
      .addOnConnectionFailedListener(this) 
      .addConnectionCallbacks(this) 
      .addApi(LocationServices.API) 
      .build(); 

    mGoogleApiClient.connect(); 
} 



@Override 
public void onConnected(@Nullable Bundle bundle) { 
    try { 
     LocationServices.GeofencingApi.addGeofences(
       mGoogleApiClient, 
       // The GeofenceRequest object. 
       getGeofencingRequest(), 
       getGeofencePendingIntent() 
     ).setResultCallback(this); // Result processed in onResult(). 
    } catch (SecurityException securityException) { 
     Log.i(getClass().getSimpleName(),securityException.getMessage()); 
    } 
} 

// Catch exception generated if the app does not use ACCESS_FINE_LOCATION permission. 
@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

} 

/** 
* Runs when the result of calling addGeofences() and removeGeofences() becomes available. 
* Either method can complete successfully or with an error. 
* 
* Since this activity implements the {@link ResultCallback} interface, we are required to 
* define this method. 
* 
* @param status The Status returned through a PendingIntent when addGeofences() or 
*    removeGeofences() get called. 
*/ 
@Override 
public void onResult(@NonNull Status status) { 
    if (status.isSuccess()) { 
     Log.i(getClass().getSimpleName(),"Success"); 
    } else { 
     // Get the status code for the error and log it using a user-friendly message. 
     Log.i(getClass().getSimpleName(),getErrorString(status.getStatusCode())); 
    } 
} 

private GeofencingRequest getGeofencingRequest() { 
    GeofencingRequest.Builder builder = new GeofencingRequest.Builder(); 
    builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER | GeofencingRequest.INITIAL_TRIGGER_DWELL); 
    builder.addGeofences(getGeofecne()); 
    return builder.build(); 
} 

private List<Geofence> getGeofecne(){ 
    List<Geofence> mGeofenceList = new ArrayList<>(); 

    //add one object 
    mGeofenceList.add(new Geofence.Builder() 
      // Set the request ID of the geofence. This is a string to identify this 
      // geofence. 
      .setRequestId("key") 

      // Set the circular region of this geofence. 
      .setCircularRegion(
        25.768466, //lat 
        47.567625, //long 
        50) // radios 

      // Set the expiration duration of the geofence. This geofence gets automatically 
      // removed after this period of time. 
      //1000 millis * 60 sec * 5 min 
      .setExpirationDuration(1000 * 60 * 5) 

      // Set the transition types of interest. Alerts are only generated for these 
      // transition. We track entry and exit transitions in this sample. 
      .setTransitionTypes(
        Geofence.GEOFENCE_TRANSITION_DWELL) 
      //it's must to set time in millis with dwell transition 
      .setLoiteringDelay(3000) 
      // Create the geofence. 
      .build()); 

    return mGeofenceList; 

} 

private PendingIntent getGeofencePendingIntent() { 
    // Reuse the PendingIntent if we already have it. 
    if (mGeofencePendingIntent != null) { 
     return mGeofencePendingIntent; 
    } 
    Intent intent = new Intent(mContext, GeofenceTransitionsIntentService.class); 
    return PendingIntent.getService(mContext, 0, intent, PendingIntent. 
      FLAG_UPDATE_CURRENT); 
} 

} verwenden können

Check meine Repo-out gibt es ein vollständiges Beispiel von Geofence mit https://github.com/3zcs/Geofence