2015-02-13 7 views
12

Quindi ho implementato la nuova API del provider di posizione Fused per ottenere una posizione dell'utente, ma per qualche motivo, non posso ottenere alcuna posizione a meno che il GPS sia attivo. Non sempre, gli utenti avranno il loro GPS acceso e vorrei non dover chiedere loro di accendere il loro GPS ogni volta che caricano l'app. Come posso dire all'API di darmi una posizione con qualsiasi provider che ha a disposizione?Il provider di posizioni fuse non ottiene la posizione a meno che il GPS sia

Ecco il mio codice:

public class FusedLocationService implements 
     LocationListener, 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 

    public interface OnLocationChangedListener { 
     public void OnLocationChanged(Location location); 
    } 

    private final String TAG = "SE8611"; 
    private boolean mRequestingLocationUpdates = true; 

    private OnLocationChangedListener mCallBack; 

    Service locationService; 
    private LocationRequest locationRequest; 
    private GoogleApiClient googleApiClient; 
    private Location mCurrentLocation; 
    private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi; 

    public FusedLocationService(Service locationService, final long INTERVAL, final long FASTEST_INTERVAL) { 
     Logger.log(TAG, "FusedLocationService called"); 

     this.mCallBack = (OnLocationChangedListener)locationService; 

     locationRequest = LocationRequest.create(); 
     locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     locationRequest.setInterval(INTERVAL); 
     locationRequest.setFastestInterval(FASTEST_INTERVAL); 
     this.locationService = locationService; 

     googleApiClient = new GoogleApiClient.Builder(locationService) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 

     if (googleApiClient != null) { 
      googleApiClient.connect(); 
     } 
    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     if(mRequestingLocationUpdates) { 
      startLocationUpdates(); 
     }else{ 
      Logger.log(TAG, "Location updates are already running."); 
     } 
    } 

    protected void startLocationUpdates() { 
     this.fusedLocationProviderApi.requestLocationUpdates(
       googleApiClient, locationRequest, this); 
     this.mRequestingLocationUpdates = false; 
    } 

    @Override 
    public void onLocationChanged(Location mCurrentLocation) { 
     Logger.log(TAG, "onLocationChanged called"); 
     this.mCurrentLocation = mCurrentLocation; 
     this.mCallBack.OnLocationChanged(this.mCurrentLocation); 
    } 

    public void startLocationUpdatesAfterResume(){ 
     if (googleApiClient.isConnected() && !mRequestingLocationUpdates) { 
      Logger.log(TAG, "startLocationUpdatesAfterResume called"); 
      this.startLocationUpdates(); 
     } 
    } 

    public void stopLocationUpdates() { 
     Logger.log(TAG, "stopping Location Updates"); 
     LocationServices.FusedLocationApi.removeLocationUpdates(
       googleApiClient, this); 
    } 

    public Location getLocation() { 
     return this.mCurrentLocation; 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     this.mRequestingLocationUpdates = true; 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     this.mRequestingLocationUpdates = true; 
    } 
} 
+1

I' Sto vivendo questo problema, hai risolto questo? – jzarsuelo

+0

stessa cosa è successo sul mio tablet Nexus 7, si prega di condividere la soluzione se è risolto, grazie –

+0

Avendo lo stesso problema, nessuna posizione a meno che il GPS non è abilitato. Hai risolto il tuo problema? – AAverin

risposta

0

ti sembra di essere utilizzando LocationRequest.PRIORITY_HIGH_ACCURACY, che preferisce utilizzando il GPS sopra e rispetto ad altri metodi. Potresti voler utilizzare PRIORITY_BALANCED_POWER_ACCURACY, che utilizzerà WiFi e torri cellulari prima di utilizzare il GPS.

Inoltre, poiché PRIORITY_BALANCED_POWER_ACCURACY è un livello di accuratezza "approssimativo", è possibile che si desideri modificare in modo appropriato il permesso di posizione nel file manifest.

The training documentation dettagli ulteriori informazioni sui flag di priorità, si potrebbe anche voler passare attraverso di essa.

+1

Beh, l'ho provato sicuramente. Tuttavia, non ricevo alcuna posizione quando utilizzo PRIORITY_BALANCED_POWER_ACCURACY. –

+0

Stai provando su un emulatore o un dispositivo? – Abhishek

+0

Sto provando su un dispositivo. Per chiarire, non ho alcuna posizione se non ho il GPS attivo. –

2

Penso di aver trovato la soluzione del problema.

Se si passa a Impostazioni -> Privacy e sicurezza -> Posizione, si noterà che la posizione non è solo GPS, ma in realtà consente all'utente di decidere quali provider possono essere utilizzati. Ad esempio, è possibile impostare solo WiFi e Cellulare per ottenere qualsiasi posizione.

L'opzione Disabilitazione posizione disattiva tutti i provider contemporaneamente, non solo il GPS.

Per verificare che l'app per gli utenti con solo WiFi possa ottenere una posizione, modificare l'impostazione su "Wifi + cellulare".

5

Ho avuto lo stesso problema come te, che non è affatto un problema. Android aveva un pulsante GPS che ti permetteva di controllarlo direttamente, ma lo sostituivano con un pulsante Località che funziona in modo diverso. Per ottenere qualsiasi tipo di posizione, è necessario accenderlo. Come te, ho pensato che il pulsante Posizione attivasse e disattivasse solo il GPS, ma non è così. È possibile controllare il GPS cambiando la modalità posizione: 1. Elevata precisione (GPS, Wi-Fi e reti mobili) 2. Risparmio energetico (Wi-Fi e reti mobili) 3. GPS solo

+0

Penso che questa risposta risolva la confusione tra posizione e GPS. –

Problemi correlati