Android Academy · Lektion

Gör rätt med platsbehörigheter

Plats i förgrunden och exakt position.

Lektion 4 av 413 steg

Gör rätt med platsbehörigheter är en gratis lektion i Android Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Android Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Android Academy innehåller totalt 4 lektioner.

Behörigheter är obligatoriska

Platsinformation är en av Androids känsligaste behörigheter. Det räcker inte att deklarera den i manifestet — i moderna versioner av Android måste du fråga användaren under körning och hantera varje svar på ett bra sätt.

Den här lektionen behandlar behörighetsnivåerna, hur du begär dem i Compose, hur du hanterar nekanden samt de nya reglerna för exakt kontra ungefärlig position och bakgrundsposition.

De tre platsbehörigheterna

Android delar upp platsåtkomst i nivåer:

  • ACCESS_COARSE_LOCATION — ungefärlig (ungefär ett kvarter).
  • ACCESS_FINE_LOCATION — exakt (GPS-nivå).
  • ACCESS_BACKGROUND_LOCATION — åtkomst när appen inte är i förgrunden.

Begär bara det du faktiskt behöver. Bakgrundsåtkomst granskas extra noggrant 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" />

Begär behörigheter i Compose

Activity Result-API:erna ger dig en launcher för behörighetsdialoger. I Compose använder du rememberLauncherForActivityResult med kontraktet 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
}

Starta begäran

Visa dialogen genom att anropa launch() med behörighetsarrayen — vanligtvis som svar på ett knapptryck, inte automatiskt när skärmen läses in.

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

Kontrollera om behörigheten redan har beviljats

Fråga inte igen om behörigheten redan har beviljats. Kontrollera med ContextCompat.checkSelfPermission innan du startar begäran.

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
}

Exakt kontra ungefärlig position

Sedan Android 12 (API 31) kan användare bevilja ungefärlig position även när du har begärt exakt position. Därför måste du begära båda behörigheterna för exakt och ungefärlig position samtidigt och acceptera att användaren kan begränsa dig till ungefärlig position.

Utforma funktionen så att den fungerar tillräckligt bra med ungefärlig position när det är möjligt.

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

Visa en förklaring

Om användaren har nekat en gång kan Android låta dig kontrollera shouldShowRequestPermissionRationale. När resultatet är true visar du en vänlig förklaring av varför du behöver platsinformation innan du frågar 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"
}

Hantera permanent nekad behörighet

Om användaren väljer Fråga inte igen (eller nekar två gånger) visar systemet inte längre dialogen. Det enda alternativet är att skicka användaren till appinställningarna så att behörigheten kan aktiveras manuellt.

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

Använd Accompanist Permissions

Biblioteket accompanist-permissions kapslar in allt detta i Compose-vänligt tillstånd. rememberMultiplePermissionsState håller reda på beviljad status och tillhandahåller ett anrop till 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")
    }
}

Regler för platsåtkomst i bakgrunden

Platsåtkomst i bakgrunden kräver ett stegvist flöde: bevilja först åtkomst när appen används (exakt eller ungefärlig), och begär sedan separat ACCESS_BACKGROUND_LOCATION, vilket öppnar systeminställningarna på Android 11 och senare. Play Butik kräver en tydlig motivering och en integritetspolicy.

Begär bara denna åtkomst om appen verkligen behöver platsinformation när den är stängd – till exempel för geofencing eller träningsspårning.

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

En behörighetsstyrd karta

Knyt ihop delarna genom att låta behörighetsstatusen styra åtkomsten till kartan. Visa kartan först när behörigheten har beviljats; visa annars en uppmaning om att begära den. Detta är det etablerade mönstret som respekterar användaren.

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

Snabb kontroll

Sedan Android 12 kan användaren välja Ungefärlig i stället för Exakt plats. Vad innebär detta för er begäran?

Sammanfattning

Nu vet ni hur ni begär platsåtkomst på ett ansvarsfullt sätt:

  • Deklarera ungefärlig och exakt plats (samt åtkomst i bakgrunden endast om det är nödvändigt) i manifestet.
  • Begär behörighet under körning med Activity Result APIs eller accompanist-permissions.
  • Begär exakt och ungefärlig plats samtidigt för att stödja växlingen mellan exakt och ungefärlig plats.
  • Visa en motivering och hänvisa användare som permanent har nekat åtkomst till appens inställningar.
  • Hantera platsåtkomst i bakgrunden som ett separat och motiverat flöde i två steg.

Därmed är Maps & Location Services slutfört – ni kan visa en karta, hitta användaren, placera ut markörer och begära behörighet på rätt sätt.

Gratis att börja

Lär dig Kotlin med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
36
Lektioner
152

Vanliga frågor

Är lektionen ”Gör rätt med platsbehörigheter” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Android Academy, inklusive ”Gör rätt med platsbehörigheter”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Android Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Gör rätt med platsbehörigheter”?

Plats i förgrunden och exakt position. Ni övar på Android Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Android Academy?

Du behöver inga förkunskaper. Utbildningen i Android Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Gör rätt med platsbehörigheter”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Android Academy-lektionen?

Ja. Varje Android Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Visa en karta
  2. Hämta användarens position
  3. Markörer och kamera
  4. Gör rätt med platsbehörigheter
← Tillbaka till Android Academy