Locatierechten goed geregeld
Locatie op de voorgrond en nauwkeurige locatie.
Locatierechten goed geregeld is een gratis Android Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Android Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Android Academy bevat in totaal 4 lessen.
Machtigingen zijn niet optioneel
Locatie is een van de gevoeligste machtigingen van Android. Het is niet genoeg om deze in het manifest te declareren — op moderne Android-versies moet je de gebruiker tijdens runtime om toestemming vragen en elk antwoord zorgvuldig afhandelen.
In deze les behandelen we de niveaus van machtigingen, het aanvragen ervan in Compose, het afhandelen van weigeringen en de nieuwe regels voor nauwkeurige versus globale en achtergrondlocatie.
De drie locatiemachtigingen
Android verdeelt locatie in niveaus:
ACCESS_COARSE_LOCATION— globale locatie (ongeveer een stadswijk).ACCESS_FINE_LOCATION— nauwkeurige locatie (gps-niveau).ACCESS_BACKGROUND_LOCATION— toegang wanneer je app niet op de voorgrond staat.
Vraag alleen aan wat je echt nodig hebt. Toegang tot de achtergrond leidt tot extra controle in de 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" />Machtigingen aanvragen in Compose
De Activity Result-API's geven je een launcher voor dialoogvensters met machtigingen. Gebruik in Compose rememberLauncherForActivityResult met het contract 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
}De aanvraag starten
Open het dialoogvenster door launch() aan te roepen met de matrix met machtigingen — meestal als reactie op een tik op een knop, niet automatisch bij het laden van het scherm.
Button(onClick = {
launcher.launch(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)
}) {
Text("Enable location")
}Controleren of de machtiging al is verleend
Vraag een machtiging niet opnieuw als deze al is verleend. Controleer dit met ContextCompat.checkSelfPermission voordat je de aanvraag start.
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
}Nauwkeurig versus globaal
Sinds Android 12 (API 31) kunnen gebruikers een globale locatie toestaan, ook wanneer je om een nauwkeurige locatie hebt gevraagd. Je moet daarom zowel de nauwkeurige als de globale machtiging samen aanvragen en accepteren dat de gebruiker je toegang kan beperken tot een globale locatie.
Ontwerp je functie zo dat deze waar mogelijk goed genoeg werkt met een globale locatie.
// 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.Een toelichting tonen
Als de gebruiker de machtiging eenmaal heeft geweigerd, kun je met shouldShowRequestPermissionRationale controleren of Android een toelichting toestaat. Als dit true is, leg dan op een vriendelijke manier uit waarom je locatie nodig hebt voordat je het opnieuw vraagt.
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"
}Een permanente weigering afhandelen
Als de gebruiker Niet meer vragen kiest (of twee keer weigert), toont het systeem het dialoogvenster niet meer. Je enige optie is de gebruiker naar de app-instellingen sturen, zodat die de machtiging handmatig kan inschakelen.
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)
}Accompanist Permissions gebruiken
De bibliotheek accompanist-permissions verpakt dit alles in status die geschikt is voor Compose. rememberMultiplePermissionsState houdt bij welke machtigingen zijn verleend en biedt een aanroep 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")
}
}Regels voor locatie op de achtergrond
Locatie op de achtergrond vereist een tweestapsproces: geef eerst toegang tot locatie op de voorgrond (nauwkeurig of globaal) en vraag daarna afzonderlijk ACCESS_BACKGROUND_LOCATION aan. Vanaf Android 11 worden daarbij de systeeminstellingen geopend. De Play Store vereist een duidelijke motivatie en een privacybeleid.
Vraag dit alleen aan als je app echt locatie nodig heeft wanneer deze gesloten is — bijvoorbeeld voor geofencing of het bijhouden van fitnessactiviteiten.
// 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".Een kaart achter een toestemmingscontrole
Breng alles samen: maak de kaart afhankelijk van de toestemmingsstatus. Laat de kaart alleen zien nadat toestemming is verleend en toon anders een prompt om toestemming te vragen. Dit is het gebruikelijke patroon waarbij je de gebruiker respecteert.
@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")
}
}
}
}Korte controle
Sinds Android 12 kan een gebruiker kiezen voor een Globale in plaats van een Nauwkeurige locatie. Wat betekent dit voor je aanvraag?
Samenvatting
Je weet nu hoe je op een verantwoorde manier toegang tot locatie aanvraagt:
- Declareer globale en nauwkeurige locatie (en alleen locatie op de achtergrond als dat essentieel is) in het manifest.
- Vraag tijdens runtime toestemming aan met Activity Result API's of
accompanist-permissions. - Vraag nauwkeurige en globale locatie samen aan, zodat de schakelaar voor nauwkeurige of globale locatie wordt ondersteund.
- Toon een toelichting en stuur gebruikers die permanent geweigerd hebben naar de app-instellingen.
- Behandel locatie op de achtergrond als een afzonderlijk, gemotiveerd tweestapsproces.
Daarmee is Kaarten en locatieservices voltooid — je kunt een kaart tonen, de gebruiker vinden, markeringen plaatsen en op de juiste manier om toestemming vragen.
Leer Kotlin met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 36
- Lessen
- 152
Veelgestelde vragen
Is de les “Locatierechten goed geregeld” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Android Academy, waaronder “Locatierechten goed geregeld”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Android Academy bevat in totaal 4 lessen.
Wat leer ik in “Locatierechten goed geregeld”?
Locatie op de voorgrond en nauwkeurige locatie. Je oefent met Android Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Android Academy te beginnen?
Ervaring vooraf is niet nodig. Android Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Locatierechten goed geregeld”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Android Academy?
Ja. Elke les over Android Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Een kaart tonen
- De locatie van de gebruiker ophalen
- Markeringen en camera
- Locatierechten goed geregeld