2017-05-20 6 views
0

Ich versuche, den letzten bekannten Standort mit Google API zu bekommen.Android Permission Request Fehler

Ich erhalte die Fehlermeldung „Anruf benötigt Berechtigungen, die zurückgewiesen werden können ...“

Allerdings habe ich bereits für die Berechtigungen in Runtime gefragt, so dass ich weiß nicht, warum der Fehler immer noch zeigt ...

Hier ist, was ich getan habe: kann

/** Value to match on callback of request permissions response */ 
public static final int MY_PERMISSIONS_REQUEST_LOCATION = 1; 


/** GoogleApiClient */ 
private GoogleApiClient googleApiClient = null; 


/** Last known location */ 
private Location lastLocation = null; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 

    // ... 

    // Create a GoogleApiClient instance 
    googleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .enableAutoManage(this, this) 
      .addApi(LocationServices.API) 
      .build(); 
} 


@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 

    switch (requestCode) { 

     case MY_PERMISSIONS_REQUEST_LOCATION: { 

      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! 
       if (permissions.length == 1 && 
        permissions[0] == Manifest.permission.ACCESS_FINE_LOCATION) { 

        // ERROR STILL SHOWING HERE! 
        lastLocation = LocationServices.FusedLocationApi.getLastLocation(
          googleApiClient); 
       } 


      } else { 

       // permission denied, boo! 
      } 
      break; 
     } 

     default: 
      break; 

    } 
} 


@Override 
public void onConnected(@Nullable Bundle bundle) { 

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED) { 

     // NO ERROR HERE, IT'S FINE 
     lastLocation = LocationServices.FusedLocationApi.getLastLocation(
       googleApiClient); 
    } else { 

     ActivityCompat.requestPermissions(this, 
       new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
       MY_PERMISSIONS_REQUEST_LOCATION); 

    } 
} 


@Override 
public void onConnectionSuspended(int i) { 
    // do nothing 
} 


@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    // An unresolvable error has occurred and a connection to Google APIs 
    // could not be established. Display an error message, or handle 
    // the failure silently 
    Toast toast = Toast.makeText(this, getText(R.string.google_api_connection_error), Toast.LENGTH_LONG); 
    toast.show(); 
} 

Wie Sie sehen, ist das, was ich tun möchte:

lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);

Warum bekomme ich immer noch den Fehler und wie kann ich das beheben?

Vielen Dank im Voraus!

+0

Wenn Sie sich auf eine Nachricht innerhalb des Android Studio Java-Editors beziehen, handelt es sich um eine Warnmeldung, nicht um einen Fehler. Wenn Sie der Meinung sind, dass alles ordnungsgemäß implementiert wurde, sollte eine Option zum Unterdrücken der im Quick-Fix-Menü verfügbaren Lint-Nachricht vorhanden sein. – CommonsWare

+0

Es ist keine Warnung, es ist ein Fehler. (rote Farbe auf Linter). Und es lässt mich das Projekt nicht bauen – Tirafesi

+0

"Es ist keine Warnung, es ist ein Fehler. (Rote Farbe auf Linter)" - AFAIK, verwendet Google nur mehr rot. "Und ich kann das Projekt nicht erstellen" - Sie erhalten wahrscheinlich einen anderen Fehler im Build-Prozess, den Sie beheben müssen. Das würde in der Gradle-Konsole oder anderen Ausgabefenstern angezeigt werden, nicht im Java-Editor. Diese bestimmte Nachricht sollte nur im Java-Editor angezeigt werden, da es sich um eine Warnmeldung "Lint" und nicht um einen Kompilierungsfehler handelt. Sie können auch das tun, was ich vorgeschlagen habe, und das Quick-Fix-Menü verwenden, um die entsprechende "@ SuppressLint" -Anmerkung hinzuzufügen. – CommonsWare

Antwort

1

Es gibt zwei Möglichkeiten, eine Beschwerde von Lint zu beheben:

  1. Code ändern zu machen Lint glücklich

  2. Lint Sagen Sie allein zu lassen, in der Regel über eine @SuppressLint Anmerkung (obwohl es Alternativen in einigen Fällen, wie zum Beispiel @TargetApi)

die meiste Zeit, ist die richtige Antwort, Ihren Code zu ändern. Wenn sich beispielsweise Lint beschwert, dass Sie eine Zeichenfolge an einer Stelle verwendet haben, an der eine Zeichenfolgenressource möglicherweise besser geeignet ist, besteht die große Wahrscheinlichkeit, dass die richtige Antwort darin besteht, eine Zeichenfolgenressource zu erstellen.

Der Grund, warum Lint insgesamt ziemlich gut ist, liegt darin, dass die meisten seiner Prüfungen sich mit einer einzelnen Java-Anweisung befassen.

In Ihrem speziellen Fall wird Lint durch eine individuelle Java-Anweisung (Ihr getLastKnownLocation() Aufruf) ausgelöst, aber es muss auch auf diese Aussage, welche Codepfade untersuchen, führen kann, und ob Sie, dass Sie die richtigen sind, zu gewährleisten halten Laufzeitberechtigung für alle diese Anrufpfade. Ehrlich gesagt, Lint ist nicht sehr gut darin. Infolgedessen wirft dieser bestimmte Lint-Check mehr "falsche Positive" als ich mag.

Möglicherweise gibt es eine Möglichkeit, Ihren Code so zu reorganisieren, dass Lint glücklich ist. Allerdings:

  • Das ist nicht gewährleistet ist, sowohl für die Lint von heute und alle möglichen zukünftigen Ausgaben von Lint

  • Der resultierende Code kann mehr verwirrend für Sie, auch wenn es weniger verwirrend Lint

  • Ihr Code in Ordnung sein kann, wie es

@SuppressLint im Grunde sagt steht: „ich weiß, was ich tue, beenden kompl aining und lass mich in Ruhe ". Manchmal ist es der einzige Weg, um Lint dazu zu bringen, sich nicht mehr über absolut gültigen Code zu beschweren.

In Ihrem speziellen Fall, testen Sie Ihren Code.Wenn der Code sowohl funktioniert, wenn Sie dies tun, als auch nicht über die erforderliche Laufzeitberechtigung verfügt, ist Ihr Code in Ordnung und @SuppressLint ist ein gültiger Ansatz.