2016-04-30 9 views
0

So habe ich Problem mit dem der LocationSettingsRequest Dialog zu zeigen, wenn GPS nicht eingeschaltet ist.LocationSettingsRequest Dialog zeigt nie

Ich verfolge die SettingsApi Documentation

Hier ist der Code:

enableGpsSetting:

public void enableGpsSetting(){ 
    if (mGoogleApiClient == null) { 

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

     LocationRequest locationRequest = LocationRequest.create(); 
     locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     locationRequest.setInterval(30 * 1000); 
     locationRequest.setFastestInterval(5 * 1000); 
     LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() 
       .addLocationRequest(locationRequest); 

     builder.setNeedBle(true); 
     //************************** 
     builder.setAlwaysShow(true); //this is the key ingredient 
     //************************** 

     PendingResult<LocationSettingsResult> result = 
       LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build()); 
     result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 
      @Override 
      public void onResult(LocationSettingsResult result) { 
       final Status status = result.getStatus(); 
       //final LocationSettingsStates = result.getLocationSettingsStates(); 
       switch (status.getStatusCode()) { 
        case LocationSettingsStatusCodes.SUCCESS: 
         // All location settings are satisfied. The client can initialize location 
         // requests here. 
         //... 
         break; 
        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
         // Location settings are not satisfied. But could be fixed by showing the user 
         // a dialog. 
         try { 
          // Show the dialog by calling startResolutionForResult(), 
          // and check the result in onActivityResult(). 
          status.startResolutionForResult(
            MainActivity.this, 
            REQUEST_CHECK_SETTINGS); 
         } catch (IntentSender.SendIntentException e) { 
          // Ignore the error. 
         } 
         break; 
        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
         // Location settings are not satisfied. However, we have no way to fix the 
         // settings so we won't show the dialog. 
         //... 
         break; 
       } 
      } 
     }); 
    } 
} 

onActivityResult

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
// Check for the integer request code originally supplied to startResolutionForResult(). 
     case REQUEST_CHECK_SETTINGS: 
      switch (resultCode) { 
       case Activity.RESULT_OK: 
        //startLocationUpdates(); 
        break; 
       case Activity.RESULT_CANCELED: 
        enableGpsSetting(); 
        break; 
      } 
      break; 
    } 
} 

Die Änderungen, die ich gemacht habe, ist Outerclass.this zu MainActivity.this ich FragmentActivity bin erstreckt weiß nicht, ob es irgendeine differece machen.

Es ist ein bisschen seltsam, wenn der Code als guidlines ist und nicht funktionieren.

+0

Sie eine Implementierung übersprungen haben, versuchen, diese [vorherige SO Ticket] Überprüfung (http://stackoverflow.com/questions/31235564/locationsettingsrequest-dialog-onactivityresult-skipped), die zeigen, wie man richtig locationsettingsrequest implementieren. Erbauer. Ich hoffe diese Hilfe. –

+0

Wenn dieses Problem weiterhin besteht, müssen Sie die Anfrage zur Standorteinstellung starten, nachdem Sie eine Verbindung mit den Google Play-Diensten hergestellt haben. Dies ist "GoogleApiClient.ConnectionsCallback # onConnected" – mr5

Antwort

0

Dieses Problem hat mir einmal passiert ist. (Eigentlich heute!)

Ich testete etwas anderes, und an einem bestimmten Punkt in meiner Anwendung wird diesen Dialog aufrufen, um die GPS-Einstellungen zu ändern. Nach mehreren Tests war ich schon müde von allen Zeit verweigern Erlaubnis GPS. (GPS war für das, was ich getestet habe, nicht wichtig.) Also habe ich den Knopf nie benutzt. Und der Dialog erschien nie. Dann, als ich ihn wieder brauchte, erschien er nicht.

Auf der Linie

endgültigen Status Status = result.getStatus()

Er begann den Code 8502 zurück - und in dem Schaltergehäuse SETTINGS_CHANGE_UNAVAILABLE.

Fall LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:

Wenn dies der Fall ist, dass Sie Ihre Anwendung deinstallieren und neu installieren, wird das Dialog Konfiguration ändern wird wieder angezeigt.

0

Verwenden Sie den folgenden Code ein.

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

    LocationRequest mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(1000*5); 
    mLocationRequest.setFastestInterval(1000*2); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

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

    PendingResult<LocationSettingsResult> result = 
      LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, 
        builder.build()); 

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 

     @Override 
     public void onResult(LocationSettingsResult result) { 
      final Status status = result.getStatus(); 
      // final LocationSettingsStates = result.getLocationSettingsStates(); 
      switch (status.getStatusCode()) { 
       case LocationSettingsStatusCodes.SUCCESS: 
        // All location settings are satisfied. The client can 
        // initialize location requests here. 

        break; 
       case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
        // Location settings are not satisfied, but this can be fixed 
        // by showing the user a dialog. 
        try { 
         // Show the dialog by calling startResolutionForResult(), 
         // and check the result in onActivityResult(). 
         status.startResolutionForResult(
           CurrentActivity.this, 
           REQUEST_CHECK_SETTINGS); 
        } catch (IntentSender.SendIntentException e) { 
         // Ignore the error. 
        } 
        break; 
       case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 

        break; 
      } 
     } 
    }); 
}