2015-04-25 10 views
12

Aggiornamento a Google Play Services v7.0 +, e basato su this sample per LocationUpdates in Android, ho il seguente codice per connettersi allo LocationServices.SettingsApi e controllare se l'utente ha tutto OK per l'applicazione ricevere il aggiornamenti di posizione.LocationServices.SettingsApi Reset SETTINGS_CHANGE_UNAVAILABLE flag

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); 
    builder.addLocationRequest(mLocationRequest); 
    mLocationSettingsRequest = builder.build(); 

    PendingResult<LocationSettingsResult> result = 
      LocationServices.SettingsApi.checkLocationSettings(
        mLocationClient, 
        mLocationSettingsRequest 
      ); 
    result.setResultCallback(this); 

Dove this è il seguente callback:

@Override 
    public void onResult(LocationSettingsResult locationSettingsResult) { 

     final Status status = locationSettingsResult.getStatus(); 
     Intent resolutionIntent; 
     switch (status.getStatusCode()) { 
      case LocationSettingsStatusCodes.SUCCESS: 
       // Everything is OK, starting request location updates 
       break; 
      case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
       // Seems the user need to change setting to enable locations updates, call startResolutionForResult(Activity, REQUEST_CODE) 
       break; 
      case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
       // Error, cannot retrieve location updates. 
       break; 
     } 
    } 

Il SUCCESS è OK per riprodurre, basta tenere il GPS abilitato.

Il RESOLUTION_REQUIRED è anche OK per riprodurre, solo disabilitare GPS.

Il SETTINGS_CHANGE_UNAVAILABLE è l'offerta: Se l'utente seleziona "MAI" quando viene eseguito il passo RESOLUTION_REQUIRED, il risultato verrà sempre con questo stato.

I servizi di Google Play hanno un'opzione per reimpostare a livello di codice il flag quando l'utente seleziona l'opzione "MAI"?

so che "mai" sembra essere "Davvero, non mi chiedere di nuovo !!!", ma pensando di creare un opzione nel caso in cui l'utente cambiare idea, naturalmente, se questo può essere possibile.

In questo caso potrò ricevere nuovamente lo stato RESOLUTION_REQUIRED e chiedere all'utente di accettare i LocationUpdate quando l'app verrà eseguita la volta successiva.

risposta

31

LocationSettingsRequest.Builder ha un metodo setAlwaysShow che cambia i pulsanti della finestra di dialogo:

Mostra sempre la finestra di dialogo, senza l'opzione "Mai" per sopprimere le future dialoghi da questa applicazione. Quando questo flag è impostato su true, verrà visualizzata la finestra di dialogo se le impostazioni di posizione non soddisfano la richiesta, anche se un utente ha precedentemente scelto "Mai". NOTA: utilizzare questo metodo solo se la finestra di dialogo è il risultato di un'azione esplicita avviata dall'utente che richiede il percorso da parte di . La cancellazione di questa finestra di dialogo dovrebbe anche annullare l'azione avviata.

Invece il default , Non ora e Mai pulsanti se si chiama setAlwaysShow(true); si avrà solo e No, in modo che l'utente non sceglierà mai e si non riceverà mai SETTINGS_CHANGE_UNAVAILABLE

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); 
builder.addLocationRequest(mLocationRequest); 
builder.setAlwaysShow(true); 
mLocationSettingsRequest = builder.build(); 

PendingResult<LocationSettingsResult> result = 
     LocationServices.SettingsApi.checkLocationSettings(
       mLocationClient, 
       mLocationSettingsRequest 
     ); 

result.setResultCallback(this); 
+2

Bello! Grazie! –

+0

Come lo sai? –

+1

Bella soluzione! Ho notato che Google Maps non aveva un pulsante _Never_, ma non riusciva a capire come funzionava e stava quasi per implementare una finestra di dialogo personalizzata senza il pulsante _Never_. La tua soluzione ha salvato la giornata! – Yuntao