Android Academy · Les

Locatierechten goed geregeld

Locatie op de voorgrond en nauwkeurige locatie.

Les 4 van 413 stappen

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.

Gratis beginnen

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

  1. Een kaart tonen
  2. De locatie van de gebruiker ophalen
  3. Markeringen en camera
  4. Locatierechten goed geregeld
← Terug naar Android Academy