2016-07-01 12 views
1

FusedLocation hat eine wunderbare API, um zu überprüfen, ob der Benutzer alle relevanten Einstellungen aktiviert hat, um den Standort zu erhalten. Ich folgte der Dokumentation https://developers.google.com/android/reference/com/google/android/gms/location/SettingsApi, um die SettingsApi zu starten. Mein Code zur Überprüfung der Benutzereinstellung lautet wie folgt:Android FusedLocation EinstellungenApi funktioniert nicht mehr als einmal

private void checkLocationSetting() 
{ 
    if (mLocationSettingsRequest == null) 
    { 
     mLocationSettingsRequest = 
       new LocationSettingsRequest.Builder() 
         .addLocationRequest(mLocationRequest) 
         .setAlwaysShow(true) 
         .build(); 
    } 

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

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() 
    { 
     @Override 
     public void onResult(LocationSettingsResult result) 
     { 
      final Status status = result.getStatus(); 
      final LocationSettingsStates state = result.getLocationSettingsStates(); 
      switch (status.getStatusCode()) 
      { 
       case LocationSettingsStatusCodes.SUCCESS: 
       { 
        // All location settings are satisfied. The client can initialize location 
        // requests here. 
        requestNewLocationBySettingLocationReq(); 
        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(SpotToiletMap.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. 
        MiscellaneousMethods.showGenericSnackBar(rootView, getString(R.string.location_settings_unavailable)); 
        break; 
       } 
      } 
     } 
    }); 
} 

Dieser Codeabschnitt funktioniert zum ersten Mal einwandfrei. Anschließend funktionierte der PendingResult CallBack nie. Ich konnte auch keine Logs auf Logcat finden. Für mich sieht es wie ein Implementierungsproblem aus.

So reproduzieren Sie das Problem.

Schalten Sie Ihr GPS aus. Versuchen Sie, die Methode aufzurufen, und sie funktioniert perfekt wie erwartet. Es fordert mich auf, n GPS zu wechseln. Sobald Sie die Standortaktualisierung erhalten haben, schalten Sie das GPS erneut aus und rufen Sie diese Methode auf. Ich bekomme nie einen Dialog um GPS zu aktivieren. Ich rufe diese Methode bei einem Klick an, der versucht, den neuesten Standort des Benutzers zu erhalten.

EDIT: Ich versuchte, PendingResult Ergebnis als eine Klassenvariable zu deklarieren. Immer noch kein Glück. Ich habe auch versucht, das Ergebnis nur einmal zu initialisieren, indem ich überprüft habe, ob es null ist, wie erwartet und wie in der Dokumentation von Google erwähnt, wirft es eine Ausnahme auf, die besagt, dass das Ergebnis bereits verbraucht ist.

+0

Welche Version von Google Play-Diensten werden Sie in Ihrer App verwenden und welche Version der Google Play-Dienste haben Sie während des Tests auf dem Gerät installiert? –

+0

Auf meinem Gerät habe ich Google Play Service 9.2.56 und in meiner App verwende ich 9.0.2. –

+0

@DanielNugent Jetzt habe ich versucht, meine App zu aktualisieren, um die neueste 9.2.0-Version zu verwenden. Immer noch dasselbe Problem –

Antwort

1

Es sieht so aus, als ob das Problem darin besteht, dass Sie das LocationSettingsRequest.Builder nicht jedes Mal neu erstellen, da Sie es nur neu erstellen, wenn es null ist.

Ich habe es funktioniert, auf Android 4.4.4 und 6.0.1 getestet.

Der Dialog jedes Mal gezeigt, die Taste gedrückt wird (vorausgesetzt, dass Standort auf dem Gerät zwischen Taste drückt, deaktiviert wurde):

public void checkLocationSetting() { 
    mLocationRequest = LocationRequest.create(); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    mLocationRequest.setInterval(30 * 1000); 
    mLocationRequest.setFastestInterval(5 * 1000); 

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

    result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build()); 

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 
     @Override 
     public void onResult(LocationSettingsResult result) { 
      final Status status = result.getStatus(); 
      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_LOCATION); 
        } 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; 
      } 
     } 
    }); 

} 
+0

Ich versuchte, den Builder jedes Mal neu zu initialisieren. Trotzdem bin ich nicht in der Lage, das Ding zum zweiten Mal in Betrieb zu bekommen. Tatsächlich habe ich 3 verschiedene Geräte ausprobiert. Das gleiche Ergebnis auf allen 3. Ich habe auch versucht, mlocationRequest zu reintegrieren. hat auch nicht funktioniert. –

+0

Nachdem ich eine weitere einfache Aktivität ohne meine Geschäftslogik erstellt hatte, konnte ich auf das Problem hinweisen. in meinem onLocationChanged() stoppe ichLocationUpdates. Das trennt mGoogleApiClient. Wenn mGoogleApiClient nicht verbunden ist, funktioniert das nicht. Hier ist mein Geist https://gist.github.com/rakesh1988/03cd9f909542f7b078c921093ef9ade9 –