Korrekt håndtering af placeringstilladelser
Placering i forgrunden og præcis placering.
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.
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
- Visning af et kort
- Hentning af brugerens placering
- Markører og kamera
- Korrekt håndtering af placeringstilladelser