Android Academy · Lekcja

Prawidłowe uprawnienia do lokalizacji

Lokalizacja na pierwszym planie i dokładna lokalizacja

Lekcja 4 z 413 kroki

Prawidłowe uprawnienia do lokalizacji to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Android Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Android Academy zawiera 4 lekcji w sumie.

Uprawnienia są niezbędne

Lokalizacja jest jednym z najbardziej wrażliwych uprawnień Androida. Zadeklarowanie jej w manifeście nie wystarczy — na współczesnym Androidzie trzeba poprosić użytkownika o zgodę w czasie działania aplikacji i właściwie obsłużyć każdą odpowiedź.

W tej lekcji omówione zostaną poziomy uprawnień, żądanie ich w Compose, obsługa odmów oraz nowe zasady dotyczące lokalizacji dokładnej i przybliżonej oraz działania w tle.

Trzy uprawnienia do lokalizacji

Android dzieli lokalizację na poziomy:

  • ACCESS_COARSE_LOCATION — przybliżona (z dokładnością do okolic).
  • ACCESS_FINE_LOCATION — dokładna (na poziomie GPS).
  • ACCESS_BACKGROUND_LOCATION — dostęp, gdy aplikacja nie działa na pierwszym planie.

Proszę żądać tylko tych uprawnień, których rzeczywiście potrzeba. Dostęp w tle podlega dodatkowej kontroli w Play Store.

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- only if truly needed: -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

Żądanie uprawnień w Compose

Interfejsy Activity Result API udostępniają launcher dla okien dialogowych uprawnień. W Compose użyj rememberLauncherForActivityResult wraz z kontraktem RequestMultiplePermissions.

import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts

val launcher = rememberLauncherForActivityResult(
    ActivityResultContracts.RequestMultiplePermissions()
) { result ->
    val fine = result[Manifest.permission.ACCESS_FINE_LOCATION] == true
    val coarse = result[Manifest.permission.ACCESS_COARSE_LOCATION] == true
    // react to the user's choice
}

Uruchamianie żądania

Wywołaj okno dialogowe za pomocą launch(), przekazując tablicę uprawnień — zwykle w reakcji na dotknięcie przycisku, a nie automatycznie podczas ładowania ekranu.

Button(onClick = {
    launcher.launch(
        arrayOf(
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
        )
    )
}) {
    Text("Enable location")
}

Sprawdzanie, czy uprawnienie zostało już przyznane

Nie wyświetlaj ponownie prośby, jeśli uprawnienie zostało już przyznane. Przed uruchomieniem żądania sprawdź je za pomocą ContextCompat.checkSelfPermission.

import androidx.core.content.ContextCompat
import android.content.pm.PackageManager

fun hasFineLocation(context: Context): Boolean {
    return ContextCompat.checkSelfPermission(
        context,
        Manifest.permission.ACCESS_FINE_LOCATION
    ) == PackageManager.PERMISSION_GRANTED
}

Lokalizacja dokładna a przybliżona

Od Androida 12 (API 31) użytkownicy mogą przyznać dostęp do lokalizacji przybliżonej, nawet jeśli poproszono o dokładną. Dlatego należy żądać obu uprawnień — dokładnego i przybliżonego — jednocześnie oraz zaakceptować możliwość ograniczenia dostępu przez użytkownika do lokalizacji przybliżonej.

Jeśli to możliwe, należy zaprojektować funkcję tak, aby działała poprawnie również z lokalizacją przybliżoną.

// Request both — the system shows a Precise/Approximate toggle
launcher.launch(
    arrayOf(
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION
    )
)
// If only COARSE comes back granted, you got approximate location.

Wyświetlanie uzasadnienia

Jeśli użytkownik odmówił raz, Android pozwala sprawdzić shouldShowRequestPermissionRationale. Gdy wartość jest równa true, przed ponownym żądaniem wyświetl przyjazne wyjaśnienie, dlaczego potrzebujesz lokalizacji.

import androidx.core.app.ActivityCompat

val shouldExplain = ActivityCompat.shouldShowRequestPermissionRationale(
    activity,
    Manifest.permission.ACCESS_FINE_LOCATION
)
if (shouldExplain) {
    // show a dialog: "We use your location to find nearby stores"
}

Obsługa trwałej odmowy

Jeśli użytkownik wybierze opcję Nie pytaj ponownie (lub odmówi dwa razy), system nie wyświetli już okna dialogowego. Jedynym rozwiązaniem jest przekierowanie użytkownika do ustawień aplikacji, gdzie może ręcznie włączyć uprawnienie.

import android.content.Intent
import android.provider.Settings
import android.net.Uri

fun openAppSettings(context: Context) {
    val intent = Intent(
        Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
        Uri.fromParts("package", context.packageName, null)
    )
    context.startActivity(intent)
}

Korzystanie z Accompanist Permissions

Biblioteka accompanist-permissions opakowuje całą tę obsługę w stan wygodny dla Compose. rememberMultiplePermissionsState śledzi stan przyznania uprawnień i udostępnia wywołanie launchMultiplePermissionRequest().

import com.google.accompanist.permissions.rememberMultiplePermissionsState

val permissions = rememberMultiplePermissionsState(
    listOf(
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION
    )
)

if (permissions.allPermissionsGranted) {
    // show the map / read location
} else {
    Button(onClick = { permissions.launchMultiplePermissionRequest() }) {
        Text("Grant location")
    }
}

Zasady lokalizacji w tle

Lokalizacja w tle wymaga dwuetapowego przepływu: najpierw należy przyznać dostęp do lokalizacji na pierwszym planie (dokładnej/przybliżonej), a następnie osobno poprosić o ACCESS_BACKGROUND_LOCATION, co w systemie Android 11 i nowszych otwiera ustawienia systemowe. Sklep Play wymaga jasnego uzasadnienia oraz polityki prywatności.

Należy prosić o ten dostęp tylko wtedy, gdy aplikacja rzeczywiście potrzebuje lokalizacji po zamknięciu — na przykład do geofencingu lub śledzenia treningu.

// Step 1: request foreground first and confirm it's granted.
// Step 2: only then request background:
launcher.launch(
    arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION)
)
// On Android 11+ this sends the user to settings to pick "Allow all the time".

Mapa chroniona uprawnieniem

Połączmy te elementy: uzależnij wyświetlanie mapy od stanu uprawnienia. Pokaż mapę dopiero po przyznaniu uprawnienia, a w przeciwnym razie wyświetl prośbę o jego przyznanie. To standardowy wzorzec, który szanuje użytkownika.

@Composable
fun LocationGate(permissions: MultiplePermissionsState) {
    when {
        permissions.allPermissionsGranted -> MapScreen()
        else -> Column {
            Text("We need location to show nearby places.")
            Button(onClick = { permissions.launchMultiplePermissionRequest() }) {
                Text("Allow location")
            }
        }
    }
}

Szybkie sprawdzenie

Od Androida 12 użytkownik może wybrać lokalizację przybliżoną zamiast dokładnej. Co oznacza to dla żądania uprawnienia?

Podsumowanie

Wiesz już, jak odpowiedzialnie prosić o dostęp do lokalizacji:

  • Zadeklaruj lokalizację przybliżoną/dokładną (a lokalizację w tle tylko wtedy, gdy jest niezbędna) w manifeście.
  • Proś o uprawnienia w czasie działania aplikacji za pomocą Activity Result APIs lub accompanist-permissions.
  • Proś jednocześnie o lokalizację dokładną i przybliżoną, aby obsłużyć przełącznik dokładnej/przybliżonej lokalizacji.
  • Wyświetl uzasadnienie i przekieruj użytkowników, którzy trwale odmówili uprawnienia, do ustawień aplikacji.
  • Obsługuj lokalizację w tle jako osobny, uzasadniony, dwuetapowy proces.

To kończy moduł Mapy i usługi lokalizacyjne — możesz wyświetlać mapę, znajdować użytkownika, umieszczać znaczniki i prawidłowo prosić o uprawnienia.

Bezpłatny start

Ucz się Kotlin dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
36
Lekcje
152

Często zadawane pytania

Czy lekcja „Prawidłowe uprawnienia do lokalizacji” jest bezpłatna?

Tak — pełny tekst „Prawidłowe uprawnienia do lokalizacji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Android Academy, przejdź na CoddyKit PRO. Kurs Android Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Prawidłowe uprawnienia do lokalizacji”?

Lokalizacja na pierwszym planie i dokładna lokalizacja Ćwiczysz Android Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Android Academy?

Nie wymagamy żadnego doświadczenia. Android Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Prawidłowe uprawnienia do lokalizacji”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Android Academy?

Tak. Każda lekcja Android Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Wyświetlanie mapy
  2. Pobieranie lokalizacji użytkownika
  3. Markery i kamera
  4. Prawidłowe uprawnienia do lokalizacji
← Powrót do Android Academy