android.location - zawiera klasy które definiują usługi oparte na lokalizacji, powiązane z usługami Android - Google Location Services API.
android.location API nie jest zalecany do uzyskiwania dostępu do lokalizacji Android. Google Location
Services API, będący częścią usług Google Play, to zalecany sposób dostępu do lokalizacji w twojej
aplikacji. Oferuje prostszy interfejs API i wyższą dokładność i nie tylko. Jeśli obecnie korzystasz
z interfejsu API android.location, powinieneś jak najszybciej przejść na interfejs Google Location
Services API com.google.android.gms.location.
...
Interfejsy
GnssAntennaInfo.Listener | Służy do odbierania informacji o antenie GNSS z silnika GNSS ang. Global Navigation Satellite Systems. |
GpsStatus.Listener | Ten interfejs jest przestarzały na poziomie API 24. Zamiast tego użyj GnssStatus.Callback. Służy do otrzymywania powiadomień o zdarzeniach GNSS. |
GpsStatus.NmeaListener | Ten interfejs jest przestarzały na 24 poziomie API. Zamiast tego użyj OnNmeaMessageListener. Służy do odbierania zdań NMEA z GNSS. NMEA 0183 to standard komunikacji z morskimi urządzeniami elektronicznymi. |
LocationListener | Służy do otrzymywania powiadomień o zmianie lokalizacji urządzenia. |
OnNmeaMessageListener | Służy do odbierania zdań NMEA z GNSS. NMEA 0183 to standard komunikacji z morskimi urządzeniami elektronicznymi. |
Klasy
Address | Klasa reprezentująca adres, tj. zbiór ciągów opisujących lokalizację. Format adresu to uproszczona wersja xAL (eXtensible Address Language) |
Criteria | Klasa wskazująca kryteria aplikacji do wyboru dostawcy lokalizacji. |
Geocoder | Klasa do obsługi geokodowania i odwrotnego geokodowania. |
GnssAntennaInfo | Klasa do obsługi geokodowania i odwrotnego geokodowania. Klasa zawierająca informacje o antenie GNSS. |
GnssAntennaInfo.Builder | Klasa konstruktora dla GnssAntennaInfo. |
GnssAntennaInfo.PhaseCenterOffset | Klasa zawierająca informacje o przesunięciu środka fazowego anteny (PCO). |
GnssAntennaInfo.SphericalCorrections | Reprezentuje poprawki na mapowaniu sferycznym. |
GnssCapabilities | Możliwości chipsetu GNSS. |
GnssCapabilities.Builder | Konstruktor GnssCapabilities. |
GnssClock | Klasa zawierająca znacznik czasu zegara GPS. |
GnssMeasurement | Klasa reprezentująca pomiar satelity GNSS, zawierająca surowe i obliczone informacje. |
GnssMeasurementRequest | Ta klasa zawiera dodatkowe parametry do przekazania w żądaniu pomiaru GNSS. |
GnssMeasurementRequest.Builder | Konstruktor GnssMeasurementRequest |
GnssMeasurementsEvent | Klasa implementująca kontener na dane powiązane ze zdarzeniem pomiarowym. |
GnssMeasurementsEvent.Callback | Służy do odbioru pomiarów satelitarnych GNSS z silnika GNSS. |
GnssNavigationMessage | Klasa zawierająca komunikat nawigacji satelitarnej GNSS. |
GnssNavigationMessage.Callback | Służy do odbierania komunikatów nawigacji satelitarnej GNSS z silnika GNSS. |
GnssStatus | Ta klasa reprezentuje bieżący stan silnika GNSS i jest używana w połączeniu z GnssStatus.Callback. |
GnssStatus.Builder | Klasa Builder ułatwiająca tworzenie nowych instancji GnssStatus. |
GnssStatus.Callback | Służy do otrzymywania powiadomień o zdarzeniach GNSS. |
GpsSatellite | Ta klasa reprezentuje aktualny stan satelity GPS. Ta klasa została uznana za przestarzałą na poziomie 24 interfejsu API. użyj GnssStatus i GnssStatus.Callback. |
GpsStatus | Ta klasa reprezentuje bieżący stan aparatu GPS. Ta klasa została uznana za przestarzałą na poziomie interfejsu API 24. Zamiast tego użyj GnssStatus. |
Location | Klasa danych reprezentująca lokalizację geograficzną. |
LocationManager | Ta klasa zapewnia dostęp do usług lokalizacji systemu. |
LocationProvider | Ta klasa została uznana za przestarzałą na poziomie interfejsu API 31. Ta klasa nie może reprezentować nieznanych właściwości dostawcy i może zwracać nieprawidłowe wyniki w rzadkich przypadkach, gdy właściwości dostawcy są nieznane. Preferuj użycie LocationManager#getProviderProperties(String), aby zamiast tego pobrać ProviderProperties. |
LocationRequest | Hermetyzacja różnych parametrów do żądania lokalizacji przez LocationManager. |
LocationRequest.Builder | Klasa konstruktora dla LocationRequest. |
SettingInjectorService | Dynamicznie określa podsumowanie (podtytuł) i włączony stan preferencji wstrzykniętych na listę ustawień aplikacji wyświetlanych przez aplikację ustawień systemowych. Do użytku tylko przez aplikacje zawarte w obrazie systemu, w przypadku preferencji, które mają wpływ na wiele aplikacji. |
Dodajemy Google Play services. W pliku build.gradle, w części dependencies musimy dodać biblioteki dotyczące android.location.
dependencies {
...
implementation 'com.google.android.gms:play-services-location:19.0.1'
...
}
Uruchamiamy synchronizację pliku build.gradle, po przez klikniecie Synk Now.
W AndroidManifest.xml dodajemy dostęp do location API:
...
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
...
Dodatkowo w AndroidManifest.xml musimy dodać uprawnienie ACCESS_FINE_LOCATION, które umożliwi dostęp do modułów lokalizacyjnych np. GPS itd.:
...
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>
Przykład:
...
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
...
public class MainActivity extends AppCompatActivity {
// kryteria aplikacji do wyboru dostawcy lokalizacji
private Criteria criteria;
// nazwa dostawcy lokalizacji
private String provider;
// szerokość geograficzna
private String a;
// długość geograficzna
private String b;
// Do przechowywania drogi przebytej urządzenia
// oraz jego ostatniej
// lokalizacji używamy zmiennych statycznych,
private static double drogaMetry;
// Parametr Location opisuje bieżącą lokalizację
// użytkownika. Już niebawem użyjemy tego parametru.
private static Location lastLocation = null;
// szerokość geograficzną
private static double latitude;
// długość geograficzną
private static double longitude;
// Obiekt LocationManager zapisujemy
// w zmiennej prywatnej, dzięki czemu
// inne metody będą miały do niego dostęp.
private LocationManager locManager;
// Łańcuch uprawnienia dodajemy jako stałą. Dotyczy lokalizacji
public static final String PERMISSION_STRING = Manifest.permission.ACCESS_FINE_LOCATION;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drogomierz);
// wskazująca kryteria aplikacji do wyboru dostawcy lokalizacji.
criteria = new Criteria();
// Wskazuje żądaną dokładność dla szerokości i długości geograficznej.
// Dokładność może wynosić ACCURACY_FINE lub ACCURACY_COARSE. Bardziej
// dokładna lokalizacja może zużywać więcej energii i może potrwać dłużej.
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
// Pobieramy najdokładniejszego dostawcę usług lokalizacji.
locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Sprawdzamy, czy aplikacja ma uprawnienie.
if(ContextCompat.checkSelfPermission(this, PERMISSION_STRING) == PackageManager.PERMISSION_GRANTED) {
// Pobieramy menedżera lokalizacji.
// Zwraca nazwę dostawcy, który najlepiej spełnia podane kryteria.
// jeśli true, uwzględniani są tylko aktywni dostawcy
provider = locManager.getBestProvider(criteria, true);
// Służy do otrzymywania powiadomień o zmianie lokalizacji urządzenia.
// Te metody są wywoływane, gdy listener został zarejestrowany w LocationManager.
startlistener = new StartLocationListener();
// sprawdzamy czy dostawca lokalizacji jest ustalony
if(provider != null) {
// Żądamy przekazywania aktualnych danych o lokalizacji.
locManager.requestLocationUpdates(provider, 1000, 1, startlistener);
}
}
// pole tekstowe
final TextView distanceView2 = (TextView)findViewById(R.id.distance2);
// Pobiera ostatnią znaną lokalizację od danego dostawcy lub null,
// jeśli nie ma ostatniej znanej lokalizacji. W niektórych
// okolicznościach zwrócona lokalizacja może być dość stara,
// dlatego zawsze należy sprawdzić wiek lokalizacji.
Location location = locManager.getLastKnownLocation(provider);
a = ""+location.getLatitude(); // pobieramy szerokość geograficzną
b = ""+location.getLongitude(); // pobieramy długość geograficzną
// prezentujemy dane w polu tekstowym
distanceView2.setText("Szerokość: " + a + ", Długość: " + b + "");
// prezentujemy dane w polu Toast
Toast.makeText(DrogomierzActivity.this, "Szerokość: "+location.getLatitude()+", Długość: "
+location.getLongitude(), Toast.LENGTH_SHORT).show();
// Podczas tworzenia aktywności wywołujemy metodę displayHandler()
// do prezentowania aktualnej lokalizacji
displayHandler();
}
@Override
public void onDestroy() {
super.onDestroy();
if (locManager != null && startlistener != null) {
// Przesyłanie danych możemy zatrzymać, wyłącznie jeśli będziemy posiadać odpowiednie uprawnienie.
if (ContextCompat.checkSelfPermission(this, PERMISSION_STRING) == PackageManager.PERMISSION_GRANTED) {
// To wywołanie kończy przekazywanie
// informacji o bieżącej lokalizacji (o ile
// mamy uprawnienia do jego wykonania).
locManager.removeUpdates(startlistener);
}
// Zapisujemy null w zmiennych
// przechowujących wcześniej
// obiekty LocationManager
// i LocationListener.
locManager = null;
startlistener = null;
}
}
// Ta metoda aktualizuje lokalizację,
private void displayHandler() {
final TextView distanceView2 = (TextView)findViewById(R.id.distance2);
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
//
double droga = 0.0;
// To wyrażenie konwertuje przebyty dystans wyrażony w metrach na kilometry
droga = drogaMetry / 1000.0;
// zapisujemy jako zasób łańcuchowy
String drogaKm = String.format(Locale.getDefault(), "%1$,.2f kilometra", droga);
// pobieramy szerokość geograficzną
a = ""+latitude;
// pobieramy długość geograficzną
b = ""+longitude;
// prezentujemy dane w polu tekstowym
distanceView2.setText("Droga: " + drogaKm + ", Szerokość: " + a + ", Długość: " + b + "");
// Informacje aktualizujemy co sekundę, w polu tekstowym i Toast
handler.postDelayed(this, 1000);
}
});
}
private class StartLocationListener implements LocationListener {
// Służy do otrzymywania powiadomień o zmianie lokalizacji urządzenia.
// Te metody są wywoływane, gdy listener został zarejestrowany w LocationManager.
@Override
public void onLocationChanged(Location location) {
// Tu aktualizujemy ostatnią lokalizację użytkownika.
if (lastLocation == null) {
lastLocation = location; // Ustawiamy wyjściowe położenie użytkownika
}
// Wyniki tłumaczenia Zwraca przybliżoną odległość
// w metrach między tą lokalizacją a podaną lokalizacją
drogaMetry += location.distanceTo(lastLocation);
lastLocation = location; // Ustawiamy aktualne położenie użytkownika
// zapisujemy szerokość geograficzną
latitude = lastLocation.getLatitude();
// zapisujemy długość geograficzną
longitude = lastLocation.getLongitude();
// prezentujemy szerokość i długość geograficzną za pomocą Toast
Toast.makeText(DrogomierzActivity.this, "Szerokość: "+lastLocation.getLatitude()+", Długość: "
+lastLocation.getLongitude(), Toast.LENGTH_SHORT).show();
}
// gdy dostawca lokalizacji zostanie włączony
@Override
public void onProviderEnabled(String provider) {
Toast.makeText(DrogomierzActivity.this, "Dostawca: "+provider+" włączony!", Toast.LENGTH_SHORT)
.show();
}
// gdy dostawca lokalizacji zostanie wyłączony
@Override
public void onProviderDisabled(String provider) {
Toast.makeText(DrogomierzActivity.this, "Dostawca: "+provider+" wyłączony!", Toast.LENGTH_SHORT)
.show();
}
// gdy dostawca lokalizacji - zmieni się jego stan
@Override
public void onStatusChanged(String provider, int status, Bundle bundle) {
Toast.makeText(DrogomierzActivity.this, "Dostawca: "+provider+" status zmienił się na: "+status+"!",
Toast.LENGTH_SHORT).show();
}
}
}
...