Ich versuche, die GPS-Koordinaten anzuzeigen, wenn ich in meinem Aktivitätslayout auf eine Schaltfläche klicke. Die folgende Methode wird aufgerufen, wenn ich auf die Schaltfläche klicke:
public void getLocation(View view) {
TextView tv = (TextView) findViewById(R.id.gps_coord_view);
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
tv.setText("Latitude: " + loc.getLatitude() + "\nLongitude: " + loc.getLongitude());
}
Ich erhalte eine Fehlermeldung
Anruf erfordert Erlaubnis, die vom Benutzer abgelehnt werden kann. Der Code sollte explizit prüfen, ob eine Berechtigung verfügbar ist.
Ich habe diese Berechtigungen bereits in meinem erteilt AndroidManifest
. Der Fehler wird behoben und die App wird kompiliert, wenn ich vor dem Aufruf Folgendes hinzufüge lm.getLastKnownLocation
:
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
Die App stürzt jedoch ab, wenn ich die Schaltfläche drücke, die beim Klicken getLocation aufruft. Was ist los? Gibt es eine bessere / einfachere Möglichkeit, die GPS-Koordinaten des Geräts zu erfassen?
android
locationmanager
Benutzer
quelle
quelle
Antworten:
Mit der Android-API-Stufe (23) müssen wir nach Berechtigungen suchen. https://developer.android.com/training/permissions/requesting.html
Ich hatte das gleiche Problem, aber Folgendes hat bei mir funktioniert und ich kann Standortdaten erfolgreich abrufen:
(1) Stellen Sie sicher, dass Ihre Berechtigungen im Manifest aufgeführt sind:
(2) Stellen Sie sicher, dass Sie vom Benutzer Berechtigungen anfordern:
(3) Stellen Sie sicher, dass Sie ContextCompat verwenden, da dies mit älteren API-Ebenen kompatibel ist.
(4) In Ihrem Standortdienst oder Ihrer Klasse, die Ihren LocationManager initialisiert und den letzten bekannten Standort abruft, müssen wir die Berechtigungen überprüfen:
(5) Dieser Ansatz hat bei mir erst funktioniert, nachdem ich @TargetApi (23) oben in meine initLocationService-Methode eingefügt habe.
(6) Ich habe dies auch zu meinem Gradle-Build hinzugefügt:
Hier ist mein LocationService als Referenz:
Ich habe bisher nur mit einem Android Lollipop-Gerät getestet. Hoffe das funktioniert bei dir.
quelle
EINFACHE LÖSUNG
Ich wollte Apps vor API 23 unterstützen und anstatt sie zu verwenden, habe
checkSelfPermission
ich einen Try / Catch verwendetquelle
Der letzte Teil der von Ihnen zitierten Fehlermeldung lautet:
...with ("checkPermission") or explicitly handle a potential "SecurityException"
Eine viel schnellere / einfachere Möglichkeit, zu überprüfen, ob Sie über Berechtigungen verfügen, besteht darin, Ihren Code mit zu umgeben
try { ... } catch (SecurityException e) { [insert error handling code here] }
. Wenn Sie über Berechtigungen verfügen, wird der Teil "try" ausgeführt. Wenn Sie dies nicht tun, wird der Teil "catch" ausgeführt.quelle
Verwenden Sie meine Kundenklasse, um die Erlaubnis zu überprüfen oder anzufordern
quelle
Wenn Sie an dynamischen Berechtigungen und Berechtigungen wie ACCESS_FINE_LOCATION arbeiten, kann ACCESS_COARSE_LOCATION mit dem Fehler "Methode PERMISSION_NAME kann nicht aufgelöst werden" in diesem Fall den Code mit dem Berechtigungsnamen schreiben und dann Ihr Projekt neu erstellen. Dadurch wird die Manifestdatei (Manifest.permission) neu generiert.
quelle
Wenn Sie einfach nach Berechtigungen suchen möchten (anstatt nach Berechtigungen zu fragen), habe ich eine einfache Erweiterung wie folgt geschrieben:
Wenn ich nun nach einer Erlaubnis suchen möchte, kann ich einfach eine Erlaubnis wie folgt übergeben:
quelle