8

Sto usando la posizione Fused Api, sto ottenendo la posizione con una precisione di circa 10 metri. Alcune volte dà una precisione da 4 a 8 metri. Voglio più precisione usando questo Api posizione fuso o con qualsiasi altro modo. C'è un modo per ottenere la posizione con meno di 4 metri di precisione.Desidero ottenere una posizione precisa con google fused location api?

Sto ottenendo la posizione in questo modo.

public class GetCurrentLocation implements 
      ConnectionCallbacks, OnConnectionFailedListener, LocationListener { 

     private static final String TAG = "location-updates-sample"; 
     public static final long UPDATE_INTERVAL_IN_MILLISECONDS = 0; 
     public static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = 
       UPDATE_INTERVAL_IN_MILLISECONDS/2; 
     private final String REQUESTING_LOCATION_UPDATES_KEY = "requesting-location-updates-key"; 
     private final String LOCATION_KEY = "location-key"; 
     private final String LAST_UPDATED_TIME_STRING_KEY = "last-updated-time-string-key"; 
     private GoogleApiClient mGoogleApiClient; 
     private LocationRequest mLocationRequest; 

     private Context mContext; 
     private getLocation mGetCurrentLocation; 

     public GetCurrentLocation(Context context) { 
      mContext = context; 

      buildGoogleApiClient(); 
     } 

     private synchronized void buildGoogleApiClient() { 
      Log.i(TAG, "Building GoogleApiClient"); 
      mGoogleApiClient = new GoogleApiClient.Builder(mContext) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this) 
        .addApi(LocationServices.API) 
        .build(); 
      createLocationRequest(); 
     } 

     public interface getLocation{ 
      public void onLocationChanged(Location location); 
     } 

     public void startGettingLocation(getLocation location) { 
      mGetCurrentLocation = location; 
      connect(); 
     } 

     public void stopGettingLocation() { 
      stopLocationUpdates(); 
      disconnect(); 
     } 

     private void createLocationRequest() { 
      mLocationRequest = new LocationRequest(); 
      mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); 
      mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); 
      mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     } 

     private void startLocationUpdates() { 
      if (mGoogleApiClient.isConnected()) { 
       LocationServices.FusedLocationApi.requestLocationUpdates(
         mGoogleApiClient, mLocationRequest, this); 
      } 
     } 
    private void stopLocationUpdates() { 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
    } 



    private void connect() { 
     mGoogleApiClient.connect(); 
    } 

    private void disconnect() { 
     if (mGoogleApiClient.isConnected()) { 
      mGoogleApiClient.disconnect(); 
     } 
    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     Log.i(TAG, "Connected to GoogleApiClient"); 
     startLocationUpdates(); 

    } 

    @Override 
    public void onLocationChanged(Location location) { 
     mGetCurrentLocation.onLocationChanged(location); 
    } 

    @Override 
    public void onConnectionSuspended(int cause) { 
     Log.i(TAG, "Connection suspended"); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult result) { 
     Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " + result.getErrorCode()); 
    } 
} 

E sto usando questa classe nel mio codice attività.

private GetCurrentLocation mListen; 
mListen = new GetCurrentLocation(this); 
      mListen.startGettingLocation(new GetCurrentLocation.getLocation() { 
       @Override 
       public void onLocationChanged(Location location) { 
        // Here is my working with location object 
       } 

      }); 

Come posso ottimizzare questo codice per ottenere la posizione precisa. Grazie.

+0

Penso che questo codice è prefetto. non penso che possa essere più ottimizzato. – Umar

risposta

4

L'accuratezza della posizione è basata sul provider GPS/rete, è possibile solo attendere e ottenere la posizione da loro.

È possibile determinare l'accuratezza di nuovo

@Override 
public void onLocationChanged(Location location) { 
    int suitableMeter = 20; // adjust your need 
    if (location.hasAccuracy() && location.getAccuracy() <= suitableMeter) { 
     // This is your most accurate location. 
    } 

} 
+1

location.getAccuracy() restituirà sempre 0.0 se location.hasAccuracy() è false. È necessario verificare hasAccuracy() prima di valutare l'accuratezza della posizione. Consultare http://developer.android.com/reference/android/location/Location.html#getAccuracy() –

+0

@MuchOverflow grazie, ho aggiornato la risposta. – james