6

Próbuję utworzyć usługę, która będzie otrzymywać aktualizacje lokalizacji co X sekund i po odległości y. Otrzymuję aktualizacje po x sekundach, ale nigdy po dystansie. Testowałem go wiele razy z różnymi wartościami i wydaje się, że setSmallestDisplacement w ogóle nie działa. Było wiele postów na ten temat, ale bez żadnego rozwiązania. Byłbym wdzięczny, gdyby ktoś mógł mi pomóc, a nawet wskazać mi inny kierunek.Fused Location Api setSmallestDisplacement zignorowano/nie działa

Moje usługi

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

} 

}

Odpowiedz

4

Według tego SO question zwłaszcza odpowiedzią CGR.

Przesunięcie ustawione dla parametru LocationRequest nie ma szans na uzyskanie lokalizacji, jeśli urządzenie wciąż znajduje się w położeniu Przesunięcie ma pierwszeństwo przed Intemetami (interwał i najszybsza interwał). Jak mogłem się domyślić - Być może przeszedłeś inny obiekt LocationRequest (bez zestawu przemieszczeń) do LocationServices.FusedLocationApi.requestLocationUpdates().

The LocationRequest setSmallestDisplacement (float smallestDisplacementMeters)

jest minimalne przemieszczenie pomiędzy aktualizacji lokalizacji w metrach. Domyślnie wartość tego wynosi 0. Zwraca ten sam obiekt, dzięki czemu setery mogą być powiązane.

UWAGA: Położenie wnioski z aplikacjami z ACCESS_COARSE_LOCATION a nie ACCESS_FINE_LOCATION automatycznie zostanie zdławiony do wolniejszym przedziału, a obiekt lokalizacja będą ukrywane tylko pokazać gruboziarnisty poziom dokładności.

Aby uzyskać więcej informacji, sprawdź to page.

2

spróbować czegoś takiego:

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 
} 
Powiązane problemy