Android Academy · Lektion

Korrekt håndtering af placeringstilladelser

Placering i forgrunden og præcis placering.

Lektion 4 af 413 trin

Korrekt håndtering af placeringstilladelser er en gratis Android Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Android Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Android Academy-kurset indeholder 4 lektioner i alt.

Tilladelser er ikke valgfri

Placering er en af Androids mest følsomme tilladelser. Det er ikke nok at angive den i manifestet — på moderne Android skal du bede brugeren om den under kørsel og håndtere hvert svar på en god måde.

Denne lektion gennemgår tilladelsesniveauerne, hvordan du anmoder om dem i Compose, hvordan du håndterer afslag samt de nye regler for præcis kontra omtrentlig placering og baggrund.

De tre placeringstilladelser

Android opdeler placering i niveauer:

  • ACCESS_COARSE_LOCATION — omtrentlig (omkring en byblok).
  • ACCESS_FINE_LOCATION — præcis (GPS-niveau).
  • ACCESS_BACKGROUND_LOCATION — adgang, mens din app ikke er i forgrunden.

Anmod kun om det, du faktisk har brug for. Adgang i baggrunden udløser ekstra kontrol i Play Butik.

<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" />

Anmod om tilladelser i Compose

Activity Result-API'erne giver dig en launcher til tilladelsesdialoger. I Compose skal du bruge rememberLauncherForActivityResult sammen med kontrakten 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
}

Start anmodningen

Udløs dialogen ved at kalde launch() med arrayet af tilladelser — typisk som svar på et tryk på en knap, ikke automatisk ved indlæsning af skærmen.

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

Kontrollér, om tilladelsen allerede er givet

Anmod ikke igen, hvis tilladelsen allerede er givet. Kontrollér med ContextCompat.checkSelfPermission, før du starter anmodningen.

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
}

Præcis kontra omtrentlig

Siden Android 12 (API 31) kan brugere give tilladelse til omtrentlig placering, selv når du anmodede om præcis placering. Derfor skal du anmode om både præcis og omtrentlig placering på samme tid og acceptere, at brugeren kan nedgradere dig til omtrentlig placering.

Udform din funktion, så den fungerer tilfredsstillende med omtrentlig placering, hvor det er muligt.

// 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.

Vis en begrundelse

Hvis brugeren har afslået én gang, kan Android lade dig kontrollere shouldShowRequestPermissionRationale. Når den er true, skal du vise en venlig forklaring på, hvorfor du har brug for placeringen, før du spørger igen.

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"
}

Håndtér et permanent afslag

Hvis brugeren vælger Spørg ikke igen (eller afslår to gange), viser systemet ikke længere dialogen. Din eneste mulighed er at sende brugeren til appindstillingerne, så tilladelsen kan aktiveres manuelt.

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)
}

Brug Accompanist Permissions

Biblioteket accompanist-permissions pakker alt dette ind i Compose-venlig tilstand. rememberMultiplePermissionsState holder styr på, hvilke tilladelser der er givet, og stiller et kald til launchMultiplePermissionRequest() til rådighed.

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")
    }
}

Regler for placering i baggrunden

Placering i baggrunden kræver et to-trins forløb: Giv først tilladelse til placering i forgrunden (præcis eller omtrentlig), og anmod derefter separat om ACCESS_BACKGROUND_LOCATION, som åbner systemindstillingerne på Android 11+. Play Butik kræver en tydelig begrundelse og en privatlivspolitik.

Bed kun om den, hvis din app faktisk har brug for placering, mens den er lukket — f.eks. til geofencing eller træningsregistrering.

// 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".

Et kort, der kræver tilladelse

Bind det hele sammen: Lad kortet afhænge af tilladelsestilstanden. Vis kun kortet, når tilladelsen er givet; ellers skal du vise en anmodning. Det er den standardiserede tilgang, der respekterer brugeren.

@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")
            }
        }
    }
}

Hurtigt tjek

Siden Android 12 kan en bruger vælge Omtrentlig i stedet for Præcis placering. Hvad betyder det for din anmodning?

Opsummering

Du ved nu, hvordan du anmoder om placering på en ansvarlig måde:

  • Angiv omtrentlig eller præcis placering (og kun placering i baggrunden, hvis det er nødvendigt) i manifestet.
  • Anmod under kørsel ved hjælp af Activity Result-API'er eller accompanist-permissions.
  • Anmod om præcis og omtrentlig placering samtidigt, så skiftet mellem præcis og omtrentlig understøttes.
  • Vis en begrundelse, og send brugere med permanent afvist tilladelse til appindstillingerne.
  • Håndter placering i baggrunden som et separat, begrundet to-trinsforløb.

Det afslutter Maps & Location Services — du kan vise et kort, finde brugeren, placere markører og anmode om tilladelse på den rigtige måde.

Gratis at komme i gang

Lær Kotlin med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
36
Lektioner
152

Ofte stillede spørgsmål

Er lektionen “Korrekt håndtering af placeringstilladelser” gratis?

Ja — alle 3 lektioner i læringssporet Android Academy, inklusive “Korrekt håndtering af placeringstilladelser”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Android Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Korrekt håndtering af placeringstilladelser”?

Placering i forgrunden og præcis placering. Du øver dig i Android Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Android Academy?

Der kræves ingen tidligere erfaring. Android Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Korrekt håndtering af placeringstilladelser”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Android Academy-lektion?

Ja. Alle Android Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Visning af et kort
  2. Hentning af brugerens placering
  3. Markører og kamera
  4. Korrekt håndtering af placeringstilladelser
← Tilbage til Android Academy