Stworzyłem małą aplikację z opisem krok po kroku, aby uzyskać współrzędne GPS bieżącej lokalizacji.
Pełny przykładowy kod źródłowy znajduje się we współrzędnych Uzyskaj bieżącą lokalizację, nazwa miasta - w Androidzie .
Zobacz jak to działa:
Wszystko, co musimy zrobić, to dodać to uprawnienie do pliku manifestu:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
I utwórz instancję LocationManager w następujący sposób:
LocationManager locationManager = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
Sprawdź, czy GPS jest włączony, czy nie.
A następnie zaimplementuj LocationListener i uzyskaj współrzędne:
LocationListener locationListener = new MyLocationListener();
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 5000, 10, locationListener);
Oto przykładowy kod, aby to zrobić
/*---------- Listener class to get coordinates ------------- */
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location loc) {
editLocation.setText("");
pb.setVisibility(View.INVISIBLE);
Toast.makeText(
getBaseContext(),
"Location changed: Lat: " + loc.getLatitude() + " Lng: "
+ loc.getLongitude(), Toast.LENGTH_SHORT).show();
String longitude = "Longitude: " + loc.getLongitude();
Log.v(TAG, longitude);
String latitude = "Latitude: " + loc.getLatitude();
Log.v(TAG, latitude);
/*------- To get city name from coordinates -------- */
String cityName = null;
Geocoder gcd = new Geocoder(getBaseContext(), Locale.getDefault());
List<Address> addresses;
try {
addresses = gcd.getFromLocation(loc.getLatitude(),
loc.getLongitude(), 1);
if (addresses.size() > 0) {
System.out.println(addresses.get(0).getLocality());
cityName = addresses.get(0).getLocality();
}
}
catch (IOException e) {
e.printStackTrace();
}
String s = longitude + "\n" + latitude + "\n\nMy Current City is: "
+ cityName;
editLocation.setText(s);
}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
}
adresses
wierszu jest tylko jeden adres zaczynający się odcityName =
, nie powiedzie się z wyjątkiem. Użycie nawiasów klamrowych to naprawi.getLastKnownLocation()
jest to bardziej „przestarzała” lokalizacja - dlaczego? Czy dzwonieniegetLastKnownLocation()
nie powoduje odczytania najnowszego sygnału GPS telefonu GPS?Oto dodatkowe informacje dla innych odpowiedzi.
Ponieważ Android ma
możesz zarejestrować się w obu i jednocześnie pobierać zdarzenia
onLocationChanged(Location location)
z dwóch. Na razie w porządku. Teraz pytanie, czy potrzebujemy dwóch wyników, czy powinniśmy wziąć to, co najlepsze. Jak wiemGPS_PROVIDER
wyniki mają lepszą dokładność niżNETWORK_PROVIDER
.Zdefiniujmy
Location
pole:Zanim zaczniemy nasłuchiwać zmiany lokalizacji , zastosujemy następującą metodę. Ta metoda zwraca ostatnią znaną lokalizację między GPS a siecią. Do tej metody najlepsze są nowsze.
Za każdym razem, gdy odzyskujemy nową lokalizację, porównujemy ją z naszym poprzednim wynikiem.
Dodaję nową metodę do
onLocationChanged
:źródło
private Location currentBestLocation = null;
i dodać metodę `makeUseOfNewLocation (location);` do metody onLocationChanged (..)Możesz znaleźć lokalizację według
GPS_PROVIDER or NETWORK_PROVIDER
.Przegląd usług lokalizacyjnych w systemie Android.
Oto jeden przykład, który próbuje znaleźć lokalizację za pomocą GPS. Jeśli GPS nie jest dostępny, spróbuj użyć sieci do znalezienia lokalizacji.
GPSTracker.java
Aktywność -AndroidGPSTrackingActivity.java
Layout- main.xml
AndroidManifest.xml
źródło
Istnieje już wiele odpowiedzi, ale chcę pokazać najnowszy sposób uzyskania lokalizacji za pomocą Google API, aby nowi programiści mogli zastosować nową metodę:
Na moim blogu demonuts.com napisałem szczegółowy samouczek na temat bieżącej lokalizacji w Androidzie. Możesz także znaleźć pełny kod źródłowy opracowany w Android Studio.
Przede wszystkim umieść to w pliku gradle
następnie zaimplementuj niezbędne interfejsy
deklarować instancje
włóż to
onCreate()
W końcu zastąp wszystkie niezbędne metody
Nie zapomnij uruchomić GPS w urządzeniu przed uruchomieniem aplikacji.
źródło
mLocation
zawsze daje zero. Próbowałem tego samego, co wspomnianocompile 'com.google.android.gms:play-services-location:11.0.4'
zamiast dodawać wszystkie usługi Google Play do swojej aplikacji.Ponieważ nie podoba mi się część kodu w innych odpowiedziach, oto moje proste rozwiązanie. To rozwiązanie ma być przydatne w działaniu lub usłudze do śledzenia lokalizacji. Gwarantuje, że nigdy nie zwróci danych, które są zbyt nieaktualne, chyba że wyraźnie zażądasz nieaktualnych danych. Można go uruchomić w trybie oddzwaniania, aby otrzymywać aktualizacje w momencie ich otrzymania, lub w trybie odpytywania w celu uzyskania najnowszych informacji.
Ogólny interfejs LocationTracker. Pozwala nam mieć wiele rodzajów modułów do śledzenia lokalizacji i łatwo podłączyć odpowiedni:
ProviderLocationTracker - ta klasa będzie śledzić lokalizację GPS lub NETWORK.
Jest to FallbackLocationTracker, który będzie śledził zarówno przez GPS, jak i SIEĆ, i używał dowolnej dokładniejszej lokalizacji.
Ponieważ oba implementują interfejs LocationTracker, możesz łatwo zmienić zdanie o tym, którego użyć. Aby uruchomić klasę w trybie odpytywania, wystarczy wywołać start (). Aby uruchomić go w trybie aktualizacji, uruchom start (Listener).
Zobacz także mój post na blogu dotyczący kodu
źródło
FallbackLocationTracker fallbackLocationTracker = new FallbackLocationTracker(mContext); fallbackLocationTracker.start(); if (fallbackLocationTracker.hasLocation()) { return fallbackLocationTracker.getLocation(); }
Uzyskaj lokalizację GPS przez -
źródło
location.getSpeed()
zwraca prędkość w metrach / sek. (Nie w metrach / min).Musisz użyć najnowszego / najnowszego
Zasadniczo musisz zrobić:
Następnie
dla najbardziej dokładnej i niezawodnej lokalizacji. Zobacz mój post tutaj:
https://stackoverflow.com/a/33599228/2644905
Nie używaj LocationListener, który nie jest dokładny i ma opóźnioną reakcję. Szczerze mówiąc, łatwiej jest to wdrożyć. Przeczytaj także dokumentację: https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient
źródło
Mam nadzieję, że to Ci pomoże...
źródło
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Teraz, gdy są już dostępne usługi lokalizacyjne Google Play , zalecam programistom rozpoczęcie korzystania z nowego dostawcy lokalizacji z fuzją. Przekonasz się, że jest łatwiejszy w użyciu i dokładniejszy. Obejrzyj wideo Google I / O Beyond the Blue Dot: nowe funkcje w lokalizacji Androida przez dwóch facetów, którzy utworzyli nowy interfejs API usług lokalizacji Google Play.
Pracuję z interfejsami API lokalizacji na wielu platformach mobilnych i myślę, że to, co zrobili ci dwaj faceci, jest naprawdę rewolucyjne. Pozbył się ogromnej złożoności korzystania z różnych dostawców. Przepełnienie stosu jest wypełnione pytaniami na temat tego, którego dostawcy użyć, czy użyć ostatniej znanej lokalizacji, jak ustawić inne właściwości w menedżerze lokalizacji LocationManager itp. Ten nowy interfejs API, który zbudowali, usuwa większość tych niepewności i sprawia, że usługi lokalizacyjne sprawiają przyjemność posługiwać się.
Napisałem aplikację na Androida, która okresowo pobiera lokalizację za pomocą usług lokalizacyjnych Google Play i wysyła lokalizację na serwer internetowy, gdzie jest przechowywana w bazie danych i może być przeglądana w Mapach Google . Napisałem zarówno oprogramowanie klienckie (dla Androida, iOS, Windows Phone i Java ME ), jak i oprogramowanie serwera (dla ASP.NET i SQL Server lub PHP i MySQL ). Oprogramowanie jest napisane w języku ojczystym na każdej platformie i działa poprawnie w tle na każdej platformie. Wreszcie oprogramowanie ma licencję MIT . Możesz znaleźć klienta na Androida tutaj:
https://github.com/nickfox/GpsTracker/tree/master/phoneClients/android
źródło
Najprostszy, jaki możesz znaleźć
źródło
LocationManager to klasa, która zapewnia wbudowane metody uzyskiwania ostatniej lokalizacji
LocationManager locationManager = (LocationManager) context.getSystemService (Context.LOCATION_SERVICE);
Istnieją dwa rodzaje dostawców GPS i sieci
Jeśli lokalizacja obiektu jest zerowy wtedy nie staraj się rozmowy poniżej metoda s
getLatitude and getLongitude is methods which returns double values
źródło
Pobieranie aktualizacji lokalizacji wymaga dużej ilości kodu bolierplate w Androidzie
Aby ułatwić sobie wykonanie tych wszystkich kroków, stworzyłem Android-EasyLocation (mała biblioteka Androida), który zajmie się wszystkimi tymi rzeczami i możesz skupić się na logice biznesowej.
Wszystko czego potrzebujesz to rozszerzyć EasyLocationActivity i to
lub
Kasa przykładowa aplikacja i kroki potrzebne tutaj na https://github.com/akhgupta/Android-EasyLocation
źródło
Zrobiłem projekt, z którego możemy uzyskać dokładną lokalizację za pomocą usług Google Play, GPS i dostawców sieci. Ten projekt można znaleźć tutaj .
Strategia w poszukiwaniu najlepszej lokalizacji polega na tym, że najpierw uzyskaj lokalizację z usług Google Play, jeśli lokalizacja zostanie znaleziona, a następnie sprawdź pogodę, czy jest lepsza, czy nie, jeśli znaleziona lokalizacja jest zerowa, uruchom ponownie usługi Google Play i spróbuj pobrać lokalizację z interfejsu API lokalizacji Android. Zarejestruj lokalizację w nasłuchiwaniu zmian, a gdy tylko zostanie znaleziona lepsza lokalizacja, oddzwonienie przywróci ją do głównej aktywności.
Jest bardzo prosty w obsłudze i realizacji w kodzie tylko dwie lekcje musimy osadzić IE
LocationManagerInterface
iSmartLocationManager
,LocationActivity
wdraża interfejs i korzystania SmartLocationManager sprowadzić lokalizację.oto klasa menedżera lokalizacji
możemy go używać z aktywnością lub fragmentem, tutaj używam go z aktywnością
Mam nadzieję, że to pomoże, jeśli możesz zasugerować jakąkolwiek poprawę, opublikuj ją na git . Dzięki.
źródło
GoogleSamples ma pełny przykład przy użyciu najnowszego FusedLocationProviderApi. Niestety najbardziej uprzywilejowane odpowiedzi są nieaktualne.
Postępuj zgodnie z poniższymi przykładami, aby zaimplementować usługi lokalizacyjne za pomocą FusedLocationProviderApi
https://github.com/googlesamples/android-play-location/tree/master/LocationUpdates
https://github.com/googlesamples/android-play-location/blob/master/LocationUpdates/app/src/main/java/com/google/android/gms/location/sample/locationupdates/MainActivity.java
źródło
Jeśli tworzysz nowe projekty lokalizacji dla Androida, powinieneś skorzystać z nowych usług lokalizacji Google Play . Jest znacznie dokładniejszy i prostszy w użyciu.
Od kilku lat pracuję nad projektem GpsTracker z otwartym źródłem GPS . Niedawno zaktualizowałem go, aby obsługiwał okresowe aktualizacje z telefonów komórkowych Android, iOS, Windows Phone i Java ME . Jest w pełni funkcjonalny i robi to, czego potrzebujesz i ma licencję MIT .
Projekt Android w GpsTracker korzysta z nowych usług Google Play, a także są dwa stosy serwerów ( ASP.NET i PHP ), które umożliwiają śledzenie tych telefonów.
źródło
Do sprawdzenia lokalizacji możesz użyć następującego kodu. Możesz umieścić go w swojej funkcji onStart () głównej aktywności i wyświetlić okno dialogowe alertu, jeśli return jest false.
źródło
Mam bardzo dokładną lokalizację za pomocą FusedLocationProviderClient
( wymagane usługi Google Play )
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
„com.google.android.gms: play-services-location: 15.0.0”
źródło
Najlepszy sposób na pobranie lokalizacji znajduje się poniżej
źródło
Opublikowałem małą bibliotekę, która może ułatwić pobieranie danych o lokalizacji w Androidzie, a nawet dba o uprawnienia środowiska wykonawczego Android M.
Możesz to sprawdzić tutaj: https://github.com/julioromano/RxLocation i użyj go lub jego kodu źródłowego jako przykładów dla swojej implementacji.
źródło
Proste wyszukiwanie Wpisz kod w metodzie lokalizacji
źródło
Polecę korzystanie z inteligentnej biblioteki lokalizacji
Bardzo prosta w obsłudze i ładnie otacza logikę lokalizacji.
Aby uruchomić usługę lokalizacji:
Jeśli chcesz uzyskać tylko jedną lokalizację (nie okresową), możesz po prostu użyć modyfikatora oneFix. Przykład:
źródło
Prosty i łatwy sposób
Uzyskaj lokalizację za pomocą https://github.com/sachinvarma/EasyLocation .
Krok 1: Po prostu zadzwoń
timeInterval -> setInterval (long) (inMilliSeconds) oznacza - ustaw interwał, w którym chcesz uzyskać lokalizacje.
najszybciejTimeInterval -> setFastestInterval (long) (inMilliSeconds) oznacza - jeśli lokalizacja jest dostępna wcześniej, możesz ją zdobyć. (tzn. inna aplikacja korzysta z usług lokalizacyjnych).
runAsBackgroundService = True -> (Usługa będzie działała w tle i będzie często aktualizowana (zgodnie z timeInterval i najszybszyTimeInterval)) runAsBackgroundService = False -> (Usługa zostanie zniszczona po udanej aktualizacji lokalizacji)
Krok 2: Przygotuj subskrybentów EventBus : zadeklaruj i opisz swoją metodę subskrybowania, opcjonalnie określ tryb wątku:
na przykład:
To wszystko.
Mam nadzieję, że to pomoże komuś w przyszłości.
źródło
Kwiecień 2020 r
Wykonaj pełne kroki, aby uzyskać bieżącą lokalizację i uniknąć nullability Ostatnia znana lokalizacja.
Według oficjalnej dokumentacji , ostatniej znanej lokalizacji może być Null w przypadku:
W takim przypadku powinieneś requestLocationUpdates i otrzymać nową lokalizację na LocationCallback .
W poniższych krokach ostatnia znana lokalizacja nigdy nie będzie pusta.
Warunek : biblioteka EasyPermission
Krok 1: W pliku manifestu dodaj to uprawnienie
Krok 2:
Krok 3: Utwórz wymagane funkcje do wywołania w funkcji onCreate ()
Krok 4:
Obsługa wywołań zwrotnych w onActivityResult () po upewnieniu się, że lokalizacja jest otwarta lub użytkownik zgadza się ją otworzyć.
Krok 5: Uzyskaj ostatnią znaną lokalizację od FusedClientApi
Mam nadzieję, że to pomoże.
Happy Coding 🤓
źródło