6

Sto provando a creare un servizio che riceverà gli aggiornamenti di posizione ogni x sec e dopo la distanza. Ricevo aggiornamenti dopo x secondi ma mai dopo la distanza. L'ho provato più volte con valori diversi e sembra che setSmallestDisplacement non funzioni affatto. Ci sono stati vari post su questo argomento, ma senza alcuna soluzione. Lo apprezzerei se qualcuno potesse aiutarmi o addirittura indicarmi una direzione diversa.Fused Location Api setSmallestDisplacement ignorato/non funzionante

mio servizio

public class GPS_Service extends Service implements GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, LocationListener { 

private GoogleApiClient mGoogleApiClient; 
private LocationRequest mLocationRequest; 
private int timethresh; 
private int distancethresh; 
protected Location mCurrentLocation; 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 

    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addApi(LocationServices.API) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .build(); 
    mGoogleApiClient.connect(); 

} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    //Set the desired interval for active location updates, in milliseconds. 
    mLocationRequest.setInterval(60* 1000); 
    //Explicitly set the fastest interval for location updates, in milliseconds. 
    mLocationRequest.setFastestInterval(30* 1000); 
    //Set the minimum displacement between location updates in meters 
    mLocationRequest.setSmallestDisplacement(1); // float 


    return super.onStartCommand(intent, flags, startId); 

} 

@Override 
public void onConnected(Bundle bundle) { 
    if (mCurrentLocation == null) { 
     mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 

    } 
    //Requests location updates from the FusedLocationApi.  
    startLocationUpdates(); 

} 

@Override 
public void onLocationChanged(Location location) { 
    mCurrentLocation = location; 
    //Toast.makeText(this, ""+mCurrentLocation.getLatitude()+","+mCurrentLocation.getLongitude(), Toast.LENGTH_SHORT).show(); 
    System.out.println(""+mCurrentLocation.getLatitude()+","+mCurrentLocation.getLongitude()); 


} 

@Override 
public void onConnectionSuspended(int i) { 
    // The connection to Google Play services was lost for some reason. We call connect() to 
    // attempt to re-establish the connection. 
    mGoogleApiClient.connect(); 
} 


@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
    Toast.makeText(getApplicationContext(),"Location services connection failed with code " + connectionResult.getErrorCode(), Toast.LENGTH_LONG).show(); 

} 

protected void startLocationUpdates() { 
    LocationServices.FusedLocationApi.requestLocationUpdates(
      mGoogleApiClient, mLocationRequest, this); 

} 

}

risposta

4

Secondo questa SO question soprattutto la risposta del CGR.

Lo Spostamento impostato per LocationRequest, non ha possibilità di ottenere le posizioni se il dispositivo è fermo poiché lo Spostamento ha la precedenza su Intevals (intervallo e valoreIntervallo). Come posso immaginare - Forse hai passato diversi oggetti LocationRequest (senza alcun set di spostamento) a LocationServices.FusedLocationApi.requestLocationUpdates().

Il LocationRequest setSmallestDisplacement (float smallestDisplacementMeters)

è impostato lo spostamento minimo tra aggiornamento di posizione in metri. Di default il valore di questo è 0. Restituisce lo stesso oggetto, in modo che i setter possano essere concatenati.

NOTA: le richieste di localizzazione di applicazioni con ACCESS_COARSE_LOCATION e non ACCESS_FINE_LOCATION saranno strozzato automaticamente a un intervallo di più lento, e l'oggetto il percorso sarà offuscato solo mostrare un livello grossolano di accuratezza.

Controllare questo page per ulteriori informazioni.

2

provare qualcosa di simile:

protected void createLocationRequest() { 
    mLocationRequest = new LocationRequest(); 

    mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); 

    mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); 

    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

    mLocationRequest.setSmallestDisplacement(100); //100 meters 
}