1. Zanim zaczniesz
Android 10 i 11 zapewniają użytkownikom większą kontrolę nad dostępem aplikacji do lokalizacji urządzenia.
Gdy aplikacja działająca na Androidzie 11 poprosi o dostęp do lokalizacji, użytkownicy mają 4 opcje:
- Zawsze zezwalaj
- Zezwalaj tylko podczas używania aplikacji (Android 10)
- Tylko raz (w Androidzie 11)
- Odmów
Android 10

Android 11

Z tego modułu dowiesz się, jak otrzymywać aktualizacje lokalizacji i jak obsługiwać lokalizację w dowolnej wersji Androida, zwłaszcza w Androidzie 10 i 11. Po ukończeniu tego laboratorium uzyskasz aplikację, która jest zgodna z obecnymi sprawdzonymi metodami pobierania aktualizacji lokalizacji.
Wymagania wstępne
- znajomość tworzenia aplikacji na Androida,
- Znajomość aktywności, usług i uprawnień
Co musisz zrobić
- Stosuj sprawdzone metody dotyczące lokalizacji na Androidzie.
- Obsługuj uprawnienia do lokalizacji na pierwszym planie (gdy użytkownik zażąda, aby aplikacja miała dostęp do lokalizacji urządzenia podczas korzystania z niej).
- Zmodyfikuj istniejącą aplikację, aby dodać obsługę żądania dostępu do lokalizacji. W tym celu dodaj kod umożliwiający subskrybowanie i anulowanie subskrypcji lokalizacji.
- Dodaj do aplikacji obsługę Androida 10 i 11, dodając logikę dostępu do lokalizacji na pierwszym planie lub podczas korzystania z aplikacji.
Czego potrzebujesz
- Android Studio 3.4 lub nowsze do uruchamiania kodu.
- urządzenie lub emulator z wersją deweloperską Androida 10 lub 11,
2. Pierwsze kroki
Sklonuj repozytorium projektu startowego
Aby jak najszybciej zacząć, możesz skorzystać z tego projektu startowego. Jeśli masz zainstalowany Git, możesz po prostu uruchomić to polecenie:
git clone https://github.com/android/codelab-while-in-use-location
Możesz bezpośrednio otworzyć stronę GitHub.
Jeśli nie masz Git, możesz pobrać projekt jako plik ZIP:
Importowanie projektu
Otwórz Android Studio, na ekranie powitalnym wybierz „Open an existing Android Studio project” (Otwórz istniejący projekt Android Studio) i otwórz katalog projektu.
Po wczytaniu projektu może się też pojawić alert, że Git nie śledzi wszystkich lokalnych zmian. Możesz kliknąć Ignoruj. (Nie będziesz przesyłać żadnych zmian z powrotem do repozytorium Git).
W lewym górnym rogu okna projektu powinna być widoczna zawartość podobna do tej na ilustracji poniżej, jeśli jesteś w widoku Android. (Jeśli jesteś w widoku Projekt, musisz rozwinąć projekt, aby zobaczyć to samo).

Są 2 foldery (base i complete). Każdy z nich jest nazywany „modułem”.
Pamiętaj, że kompilacja projektu w Android Studio może potrwać kilka sekund. W tym czasie na pasku stanu u dołu Android Studio zobaczysz ten komunikat:

Zanim wprowadzisz zmiany w kodzie, poczekaj, aż Android Studio zakończy indeksowanie i budowanie projektu. Dzięki temu Android Studio pobierze wszystkie niezbędne komponenty.
Jeśli pojawi się komunikat Załadować ponownie, aby zmiany języka zostały wprowadzone? lub podobny, kliknij Tak.
Informacje o projekcie startowym
Konfiguracja została zakończona i możesz poprosić o lokalizację w aplikacji. Użyj modułu base jako punktu początkowego. Na każdym etapie dodaj kod do modułu base. Po ukończeniu tego ćwiczenia kod w module base powinien być zgodny z zawartością modułu complete. Moduł complete może służyć do sprawdzania Twojej pracy lub jako źródło informacji, jeśli napotkasz jakieś problemy.
Kluczowe komponenty to:
MainActivity– interfejs użytkownika, który umożliwia zezwolenie aplikacji na dostęp do lokalizacji urządzenia;LocationService– usługa, która subskrybuje zmiany lokalizacji i rezygnuje z subskrypcji, a także promuje się jako usługa działająca na pierwszym planie (z powiadomieniem), jeśli użytkownik opuści aktywność aplikacji. Tutaj dodajesz kod lokalizacji.Util– dodaje funkcje rozszerzeń do klasyLocationi zapisuje lokalizację wSharedPreferences(uproszczona warstwa danych).
Konfiguracja emulatora
Informacje o konfigurowaniu emulatora Androida znajdziesz w artykule Uruchamianie na emulatorze.
Uruchamianie projektu startowego
Uruchom aplikację.
- Podłącz urządzenie z Androidem do komputera lub uruchom emulator. (Upewnij się, że na urządzeniu jest zainstalowany Android 10 lub nowszy).
- Na pasku narzędzi wybierz konfigurację
basez menu i kliknij Uruchom:

- Na urządzeniu pojawi się ta aplikacja:

Możesz zauważyć, że na ekranie z wynikami nie wyświetlają się żadne informacje o lokalizacji. Dzieje się tak, ponieważ nie został jeszcze dodany kod lokalizacji.
3. Dodawanie lokalizacji
Pojęcia
Te ćwiczenia mają na celu pokazanie, jak otrzymywać aktualizacje lokalizacji i w przyszłości obsługiwać Androida 10 i 11.
Zanim jednak zaczniesz pisać kod, warto zapoznać się z podstawami.
Rodzaje dostępu do lokalizacji
Na początku tego przewodnika wspominaliśmy o 4 różnych opcjach dostępu do lokalizacji. Oto ich znaczenie:
- Zezwalaj tylko podczas używania aplikacji
- Ta opcja jest zalecana w przypadku większości aplikacji. Ta opcja, znana też jako dostęp „podczas używania” lub „tylko na pierwszym planie”, została dodana w Androidzie 10 i umożliwia deweloperom pobieranie lokalizacji tylko wtedy, gdy aplikacja jest aktywnie używana. Aplikacja jest uznawana za aktywną, jeśli spełniony jest jeden z tych warunków:
- Działanie jest widoczne.
- Usługa na pierwszym planie działa z powiadomieniem o trwającej aktywności.
- Tylko raz
- Dodane w Androidzie 11. Działa tak samo jak Zezwalaj tylko podczas używania aplikacji, ale przez ograniczony czas. Więcej informacji znajdziesz w artykule Uprawnienia jednorazowe.
- Odrzuć
- Ta opcja uniemożliwia dostęp do informacji o lokalizacji.
- Zawsze zezwalaj
- Ta opcja umożliwia dostęp do lokalizacji przez cały czas, ale wymaga dodatkowego uprawnienia w przypadku Androida 10 i nowszych wersji. Musisz też mieć prawidłowy przypadek użycia i przestrzegać zasad dotyczących lokalizacji. Nie będziemy omawiać tej opcji w tym laboratorium, ponieważ jest ona rzadziej używana. Jeśli jednak masz uzasadniony przypadek użycia i chcesz dowiedzieć się, jak prawidłowo obsługiwać lokalizację przez cały czas, w tym dostęp do lokalizacji w tle, zapoznaj się z przykładem LocationUpdatesBackgroundKotlin.
Usługi, usługi działające na pierwszym planie i powiązania
Aby w pełni obsługiwać aktualizacje lokalizacji w przypadku opcji Zezwalaj tylko podczas używania aplikacji, musisz uwzględnić sytuację, w której użytkownik opuści aplikację. Jeśli chcesz nadal otrzymywać aktualizacje w takiej sytuacji, musisz utworzyć usługę działającą na pierwszym planie Service i powiązać ją z Notification.
Jeśli chcesz używać tego samego Service do wysyłania żądań aktualizacji lokalizacji, gdy aplikacja jest widoczna i gdy użytkownik z niej wychodzi, musisz powiązać lub odłączyć ten Service z elementem interfejsu.
To ćwiczenie skupia się tylko na uzyskiwaniu aktualizacji lokalizacji, więc cały potrzebny kod znajdziesz w klasie ForegroundOnlyLocationService.kt. Możesz przejrzeć tę klasę i MainActivity.kt, aby zobaczyć, jak ze sobą współpracują.
Więcej informacji znajdziesz w omówieniu usług i omówieniu usług powiązanych.
Uprawnienia
Aby otrzymywać aktualizacje lokalizacji z NETWORK_PROVIDER lub GPS_PROVIDER, musisz poprosić użytkownika o uprawnienia, deklarując w pliku manifestu Androida odpowiednio uprawnienie ACCESS_COARSE_LOCATION lub ACCESS_FINE_LOCATION. Bez tych uprawnień aplikacja nie będzie mogła prosić o dostęp do lokalizacji w czasie działania.
Te uprawnienia obejmują przypadki Tylko raz i Zezwalaj tylko podczas używania aplikacji, gdy aplikacja jest używana na urządzeniu z Androidem 10 lub nowszym.
Lokalizacja
Aplikacja może uzyskać dostęp do zestawu obsługiwanych usług lokalizacyjnych za pomocą klas w pakiecie com.google.android.gms.location.
Sprawdź główne klasy:
FusedLocationProviderClient- Jest to centralny komponent platformy lokalizacyjnej. Po utworzeniu możesz go używać do wysyłania próśb o aktualizacje lokalizacji i pobierania ostatniej znanej lokalizacji.
LocationRequest- Jest to obiekt danych zawierający parametry jakości usługi dla żądań (interwały aktualizacji, priorytety i dokładność). Jest on przekazywany do interfejsu
FusedLocationProviderClient, gdy prosisz o aktualizacje lokalizacji. LocationCallback- Służy do otrzymywania powiadomień, gdy lokalizacja urządzenia ulegnie zmianie lub nie można jej już określić. Przekazywany jest do niej obiekt
LocationResult, z którego możesz pobraćLocationdo zapisania w bazie danych.
Znasz już podstawy, więc zacznij pisać kod.
4. Dodawanie funkcji lokalizacji
W tym laboratorium skupimy się na najczęstszej opcji lokalizacji: Zezwalaj tylko podczas używania aplikacji.
Aby otrzymywać aktualizacje lokalizacji, aplikacja musi mieć widoczną aktywność lub usługę działającą na pierwszym planie (z powiadomieniem).
Uprawnienia
Celem tego laboratorium jest pokazanie, jak otrzymywać aktualizacje lokalizacji, a nie jak prosić o uprawnienia do lokalizacji, więc kod oparty na uprawnieniach jest już napisany. Jeśli już to wiesz, możesz pominąć ten krok.
Poniżej znajdziesz najważniejsze informacje o uprawnieniach (w tej części nie musisz niczego robić):
- Zadeklaruj, jakich uprawnień używasz w
AndroidManifest.xml. - Zanim spróbujesz uzyskać dostęp do informacji o lokalizacji, sprawdź, czy użytkownik przyznał Twojej aplikacji odpowiednie uprawnienia. Jeśli aplikacja nie ma jeszcze uprawnień, poproś o dostęp.
- Obsługa wyboru uprawnień użytkownika. (Ten kod znajdziesz na stronie
MainActivity.kt).
Jeśli w AndroidManifest.xml lub MainActivity.kt wyszukasz TODO: Step 1.0, Review Permissions, zobaczysz cały kod napisany na potrzeby uprawnień.
Więcej informacji znajdziesz w artykule Omówienie uprawnień.
Teraz zacznij pisać kod lokalizacji.
Sprawdź kluczowe zmienne potrzebne do aktualizacji lokalizacji
W module base wyszukaj TODO: Step 1.1, Review variables w
ForegroundOnlyLocationService.kt.
Na tym etapie nie musisz nic robić. Aby poznać kluczowe klasy i zmienne używane do otrzymywania aktualizacji lokalizacji, wystarczy zapoznać się z tym blokiem kodu i komentarzami.
// TODO: Step 1.1, Review variables (no changes).
// FusedLocationProviderClient - Main class for receiving location updates.
private lateinit var fusedLocationProviderClient: FusedLocationProviderClient
// LocationRequest - Requirements for the location updates, i.e., how often you
// should receive updates, the priority, etc.
private lateinit var locationRequest: LocationRequest
// LocationCallback - Called when FusedLocationProviderClient has a new Location.
private lateinit var locationCallback: LocationCallback
// Used only for local storage of the last known location. Usually, this would be saved to your
// database, but because this is a simplified sample without a full database, we only need the
// last location to create a Notification if the user navigates away from the app.
private var currentLocation: Location? = null
Sprawdź inicjowanie FusedLocationProviderClient
W module base wyszukaj TODO: Step 1.2, Review the FusedLocationProviderClient w pliku ForegroundOnlyLocationService.kt. Kod powinien wyglądać mniej więcej tak:
// TODO: Step 1.2, Review the FusedLocationProviderClient.
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
Jak wspomnieliśmy w poprzednich komentarzach, jest to główna klasa do otrzymywania aktualizacji lokalizacji. Zmienna jest już zainicjowana, ale warto sprawdzić kod, aby zrozumieć, jak to się odbywa. Później dodasz tu kod, aby wysyłać prośby o aktualizacje lokalizacji.
Zainicjuj LocationRequest
- W module
basewyszukajTODO: Step 1.3, Create a LocationRequestw plikuForegroundOnlyLocationService.kt. - Po komentarzu dodaj ten kod:
Kod inicjujący LocationRequest dodaje dodatkowe parametry jakości usługi potrzebne w Twoim żądaniu (interwały, maksymalny czas oczekiwania i priorytet).
// TODO: Step 1.3, Create a LocationRequest.
locationRequest = LocationRequest.create().apply {
// Sets the desired interval for active location updates. This interval is inexact. You
// may not receive updates at all if no location sources are available, or you may
// receive them less frequently than requested. You may also receive updates more
// frequently than requested if other applications are requesting location at a more
// frequent interval.
//
// IMPORTANT NOTE: Apps running on Android 8.0 and higher devices (regardless of
// targetSdkVersion) may receive updates less frequently than this interval when the app
// is no longer in the foreground.
interval = TimeUnit.SECONDS.toMillis(60)
// Sets the fastest rate for active location updates. This interval is exact, and your
// application will never receive updates more frequently than this value.
fastestInterval = TimeUnit.SECONDS.toMillis(30)
// Sets the maximum time when batched location updates are delivered. Updates may be
// delivered sooner than this interval.
maxWaitTime = TimeUnit.MINUTES.toMillis(2)
priority = LocationRequest.PRIORITY_HIGH_ACCURACY
}
- Przeczytaj komentarze, aby dowiedzieć się, jak działa każdy z nich.
Inicjowanie LocationCallback
- W module
basewyszukajTODO: Step 1.4, Initialize the LocationCallbackw plikuForegroundOnlyLocationService.kt. - Po komentarzu dodaj ten kod:
// TODO: Step 1.4, Initialize the LocationCallback.
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
super.onLocationResult(locationResult)
// Normally, you want to save a new location to a database. We are simplifying
// things a bit and just saving it as a local variable, as we only need it again
// if a Notification is created (when the user navigates away from app).
currentLocation = locationResult.lastLocation
// Notify our Activity that a new location was added. Again, if this was a
// production app, the Activity would be listening for changes to a database
// with new locations, but we are simplifying things a bit to focus on just
// learning the location side of things.
val intent = Intent(ACTION_FOREGROUND_ONLY_LOCATION_BROADCAST)
intent.putExtra(EXTRA_LOCATION, currentLocation)
LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(intent)
// Updates notification content if this service is running as a foreground
// service.
if (serviceRunningInForeground) {
notificationManager.notify(
NOTIFICATION_ID,
generateNotification(currentLocation))
}
}
}
Utworzona tu funkcja LocationCallback to wywołanie zwrotne, które funkcja FusedLocationProviderClient wywoła, gdy będzie dostępna nowa informacja o zmianie lokalizacji.
W wywołaniu zwrotnym najpierw pobierasz najnowszą lokalizację za pomocą obiektu LocationResult. Następnie powiadamiasz Activity o nowej lokalizacji za pomocą transmisji lokalnej (jeśli jest aktywna) lub aktualizujesz Notification, jeśli ta usługa działa jako Service na pierwszym planie.
- Przeczytaj komentarze, aby dowiedzieć się, co robi każda część.
Subskrybowanie zmian lokalizacji
Po zainicjowaniu wszystkiego musisz poinformować FusedLocationProviderClient, że chcesz otrzymywać aktualizacje.
- W module
basewyszukajStep 1.5, Subscribe to location changesw plikuForegroundOnlyLocationService.kt. - Po komentarzu dodaj ten kod:
// TODO: Step 1.5, Subscribe to location changes.
fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
Wywołanie requestLocationUpdates() informuje FusedLocationProviderClient, że chcesz otrzymywać aktualizacje lokalizacji.
Prawdopodobnie rozpoznajesz zdefiniowane wcześniej zmienne LocationRequest i LocationCallback. Informują one FusedLocationProviderClient o parametrach jakości usługi dla Twojego żądania i o tym, co ma wywołać, gdy otrzyma aktualizację. Na koniec obiekt Looper określa wątek wywołania zwrotnego.
Możesz też zauważyć, że ten kod znajduje się w instrukcji try/catch. Ta metoda wymaga takiego bloku, ponieważ SecurityException występuje, gdy aplikacja nie ma uprawnień dostępu do informacji o lokalizacji.
Anulowanie subskrypcji powiadomień o zmianach lokalizacji
Gdy aplikacja nie potrzebuje już dostępu do informacji o lokalizacji, ważne jest, aby zrezygnować z otrzymywania aktualizacji lokalizacji.
- W module
basewyszukajTODO: Step 1.6, Unsubscribe to location changesw plikuForegroundOnlyLocationService.kt. - Po komentarzu dodaj ten kod:
// TODO: Step 1.6, Unsubscribe to location changes.
val removeTask = fusedLocationProviderClient.removeLocationUpdates(locationCallback)
removeTask.addOnCompleteListener { task ->
if (task.isSuccessful) {
Log.d(TAG, "Location Callback removed.")
stopSelf()
} else {
Log.d(TAG, "Failed to remove Location Callback.")
}
}
Metoda removeLocationUpdates() konfiguruje zadanie, aby poinformować FusedLocationProviderClient, że nie chcesz już otrzymywać aktualizacji lokalizacji LocationCallback. addOnCompleteListener() wywołuje wywołanie zwrotne po zakończeniu i wykonuje Task.
Podobnie jak w poprzednim kroku, możesz zauważyć, że ten kod znajduje się w instrukcji try/catch. Ta metoda wymaga takiego bloku, ponieważ SecurityException występuje, gdy aplikacja nie ma uprawnień do uzyskiwania dostępu do informacji o lokalizacji.
Możesz się zastanawiać, kiedy wywoływane są metody zawierające kod subskrypcji lub rezygnacji z subskrypcji. Są one wywoływane w głównej klasie, gdy użytkownik dotknie przycisku. Jeśli chcesz ją zobaczyć, zajrzyj do klasy MainActivity.kt.
Uruchom aplikację
Uruchom aplikację z Androida Studio i wypróbuj przycisk lokalizacji.
Na ekranie wyjściowym powinny być widoczne informacje o lokalizacji. Jest to w pełni funkcjonalna aplikacja na Androida 9.


5. Obsługa Androida 10
W tej sekcji dodasz obsługę Androida 10.
Aplikacja już subskrybuje zmiany lokalizacji, więc nie musisz wiele robić.
Wystarczy, że określisz, że usługa działająca na pierwszym planie jest używana do określania lokalizacji.
Docelowy pakiet SDK 29
- W module
basewyszukajTODO: Step 2.1, Target Android 10 and then Android 11.w plikubuild.gradle. - Wprowadź te zmiany:
- Ustaw wartość
targetSdkVersionna29.
Kod powinien wyglądać mniej więcej tak:
android {
// TODO: Step 2.1, Target Android 10 and then Android 11.
compileSdkVersion 29
defaultConfig {
applicationId "com.example.android.whileinuselocation"
minSdkVersion 26
targetSdkVersion 29
versionCode 1
versionName "1.0"
}
...
}
Następnie pojawi się prośba o zsynchronizowanie projektu. Kliknij Synchronizuj teraz.

Po tym aplikacja będzie prawie gotowa na Androida 10.
Dodawanie typu usługi działającej na pierwszym planie
W Androidzie 10 musisz podać typ usługi na pierwszym planie, jeśli potrzebujesz dostępu do lokalizacji podczas używania. W Twoim przypadku jest ona używana do uzyskiwania informacji o lokalizacji.
W module base wyszukaj TODO: 2.2, Add foreground service type w AndroidManifest.xml i dodaj ten kod do elementu <service>:
android:foregroundServiceType="location"
Kod powinien wyglądać mniej więcej tak:
<application>
...
<!-- Foreground services in Android 10+ require type. -->
<!-- TODO: 2.2, Add foreground service type. -->
<service
android:name="com.example.android.whileinuselocation.ForegroundOnlyLocationService"
android:enabled="true"
android:exported="false"
android:foregroundServiceType="location" />
</application>
To wszystko. Aplikacja obsługuje lokalizację w Androidzie 10 w przypadku korzystania z niej, zgodnie ze sprawdzonymi metodami dotyczącymi lokalizacji w Androidzie.
Uruchom aplikację
Uruchom aplikację z Androida Studio i wypróbuj przycisk lokalizacji.
Wszystko powinno działać tak jak wcześniej, ale teraz działa na Androidzie 10. Jeśli wcześniej nie zaakceptowano uprawnień do lokalizacji, powinien teraz pojawić się ekran uprawnień.



6. Obsługa Androida 11
W tej sekcji kierujesz reklamy na Androida 11.
Dobra wiadomość: nie musisz wprowadzać zmian w żadnych plikach z wyjątkiem pliku build.gradle.
Docelowy pakiet SDK 11
- W module
basewyszukajTODO: Step 2.1, Target SDKw plikubuild.gradle. - Wprowadź te zmiany:
- Od
compileSdkVersiondo30 - Od
targetSdkVersiondo30
Kod powinien wyglądać mniej więcej tak:
android {
TODO: Step 2.1, Target Android 10 and then Android 11.
compileSdkVersion 30
defaultConfig {
applicationId "com.example.android.whileinuselocation"
minSdkVersion 26
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
...
}
Następnie pojawi się prośba o zsynchronizowanie projektu. Kliknij Synchronizuj teraz.

Po tym czasie aplikacja będzie gotowa na Androida 11.
Uruchom aplikację
Uruchom aplikację z Androida Studio i spróbuj kliknąć przycisk.
Wszystko powinno działać tak jak wcześniej, ale teraz działa na Androidzie 11. Jeśli wcześniej nie zaakceptowano uprawnień do lokalizacji, powinien teraz pojawić się ekran uprawnień.


7. Strategie lokalizacji na Androidzie
Sprawdzając uprawnienia do lokalizacji i prosząc o nie w sposób pokazany w tym samouczku, Twoja aplikacja może skutecznie śledzić poziom dostępu do lokalizacji urządzenia.
Na tej stronie znajdziesz kilka najważniejszych sprawdzonych metod związanych z uprawnieniami do lokalizacji. Więcej informacji o tym, jak chronić dane użytkowników, znajdziesz w artykule Sprawdzone metody dotyczące uprawnień aplikacji.
Proś tylko o uprawnienia, których potrzebujesz
Proś o uprawnienia tylko wtedy, gdy są potrzebne. Na przykład:
- Nie proś o dostęp do lokalizacji przy uruchamianiu aplikacji, chyba że jest to absolutnie konieczne.
- Jeśli Twoja aplikacja jest kierowana na Androida 10 lub nowszego i zawiera usługę działającą na pierwszym planie, zadeklaruj
foregroundServiceType"location"w pliku manifestu. - Nie proś o uprawnienia do lokalizacji w tle, jeśli nie masz uzasadnionego przypadku użycia opisanego w artykule Bezpieczniejszy i bardziej przejrzysty dostęp do lokalizacji użytkownika.
Obsługa łagodnej degradacji, jeśli uprawnienie nie zostanie przyznane
Aby zapewnić użytkownikom wygodę, zaprojektuj aplikację tak, aby dobrze radziła sobie w tych sytuacjach:
- Aplikacja nie ma dostępu do informacji o lokalizacji.
- Aplikacja nie ma dostępu do informacji o lokalizacji, gdy działa w tle.
8. Gratulacje
Wiesz już, jak otrzymywać aktualizacje lokalizacji na Androidzie, pamiętając o sprawdzonych metodach.
Więcej informacji
- Pełny przykład użycia lokalizacji w tle, jeśli masz uzasadniony przypadek użycia.
- Prośba o aktualizacje lokalizacji