Próbuję wyświetlić współrzędne GPS, gdy kliknę przycisk w moim układzie aktywności. Oto metoda wywoływana po kliknięciu przycisku:
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());
}
Otrzymuję komunikat o błędzie
Połączenie wymaga pozwolenia, które może zostać odrzucone przez użytkownika. Kod powinien jawnie sprawdzać, czy zezwolenie jest dostępne.
Udzieliłem już tych uprawnień w moim AndroidManifest
. Błąd jest usuwany, a aplikacja kompiluje się, gdy przed wywołaniem dodam lm.getLastKnownLocation
:
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
Jednak aplikacja ulega awarii, gdy naciskam przycisk wywołujący getLocation po kliknięciu. Co się dzieje? Czy istnieje lepszy / prostszy sposób na pobranie współrzędnych GPS urządzenia?
android
locationmanager
użytkownik
źródło
źródło
Odpowiedzi:
Na poziomie Android API (23) musimy sprawdzić uprawnienia. https://developer.android.com/training/permissions/requesting.html
Miałem ten sam problem, ale poniższe zadziałały i mogę pomyślnie pobrać dane lokalizacji:
(1) Upewnij się, że masz swoje uprawnienia wymienione w Manifeście:
(2) Upewnij się, że żądasz uprawnień od użytkownika:
(3) Upewnij się, że używasz ContextCompat, ponieważ ma on kompatybilność ze starszymi poziomami API.
(4) W Twojej usłudze lokalizacyjnej lub klasie, która inicjuje LocationManager i pobiera ostatnią znaną lokalizację, musimy sprawdzić uprawnienia:
(5) To podejście zadziałało dla mnie dopiero po włączeniu @TargetApi (23) na początku mojej metody initLocationService.
(6) Dodałem również to do mojej kompilacji gradle:
Oto moja usługa lokalizacji w celach informacyjnych:
Do tej pory testowałem tylko z urządzeniem z Androidem Lollipop. Mam nadzieję, że to działa dla Ciebie.
źródło
PROSTE ROZWIĄZANIE
Chciałem obsługiwać aplikacje przed api 23 i zamiast
checkSelfPermission
używać try / catchźródło
Ostatnia część zacytowanego komunikatu o błędzie brzmi:
...with ("checkPermission") or explicitly handle a potential "SecurityException"
O wiele szybszym / prostszym sposobem sprawdzenia, czy masz uprawnienia, jest otoczenie kodu
try { ... } catch (SecurityException e) { [insert error handling code here] }
. Jeśli masz uprawnienia, zostanie wykonana część „try”, a jeśli nie, część „catch” będzie.źródło
Użyj mojej klasy custome, aby sprawdzić lub poprosić o pozwolenie
źródło
jeśli pracujesz z uprawnieniami dynamicznymi i jakimkolwiek zezwoleniem, takim jak ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, dając błąd „nie można rozwiązać metody PERMISSION_NAME”, w tym przypadku napisz kod z nazwą uprawnienia, a następnie odbuduj projekt, spowoduje to ponowne wygenerowanie pliku manifestu (Manifest.permission).
źródło
Jeśli chcesz po prostu sprawdzić uprawnienia (zamiast poprosić o uprawnienia), napisałem proste rozszerzenie, takie jak:
Teraz, jeśli chcę sprawdzić pozwolenie, mogę po prostu przekazać zezwolenie w następujący sposób:
źródło