Android Academy · Lezione

Gestire correttamente i permessi di posizione

Posizione in primo piano e precisa

Lezione 4 di 413 passaggi

Gestire correttamente i permessi di posizione è una lezione Android Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Android Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Android Academy include 4 lezioni in totale.

Le autorizzazioni sono indispensabili

La posizione è una delle autorizzazioni più sensibili di Android. Dichiararla nel manifest non basta: nelle versioni moderne di Android è necessario chiederla all'utente in fase di esecuzione e gestire in modo appropriato ogni risposta.

Questa lezione tratta i livelli delle autorizzazioni, la loro richiesta in Compose, la gestione dei rifiuti e le nuove regole per la posizione precisa o approssimativa e per l'accesso in background.

Le tre autorizzazioni per la posizione

Android suddivide la posizione in livelli:

  • ACCESS_COARSE_LOCATION — approssimativa (circa un isolato).
  • ACCESS_FINE_LOCATION — precisa (a livello GPS).
  • ACCESS_BACKGROUND_LOCATION — accesso quando l'app non è in primo piano.

Richieda solo ciò che le serve realmente. L'accesso in background è sottoposto a controlli aggiuntivi sul 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" />

Richiedere autorizzazioni in Compose

Le Activity Result API forniscono un launcher per le finestre di dialogo delle autorizzazioni. In Compose, usi rememberLauncherForActivityResult con il contratto 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
}

Avviare la richiesta

Attivi la finestra di dialogo chiamando launch() con l'array delle autorizzazioni, in genere in risposta al tocco di un pulsante e non automaticamente al caricamento della schermata.

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

Verificare se è già stata concessa

Non mostri nuovamente la richiesta se l'autorizzazione è già stata concessa. Verifichi con ContextCompat.checkSelfPermission prima di avviare la richiesta.

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
}

Precisa o approssimativa

A partire da Android 12 (API 31), gli utenti possono concedere l'accesso alla posizione approssimativa anche quando è stata richiesta quella precisa. Deve quindi richiedere entrambe le autorizzazioni, precisa e approssimativa, contemporaneamente e accettare che l'utente possa limitare l'accesso a quella approssimativa.

Progetti la funzionalità in modo che funzioni adeguatamente, quando possibile, anche con una posizione approssimativa.

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

Mostrare una motivazione

Se l'utente ha rifiutato una volta, Android consente di verificare shouldShowRequestPermissionRationale. Quando restituisce true, mostri una spiegazione chiara del motivo per cui le serve la posizione prima di chiederla nuovamente.

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

Gestire il rifiuto permanente

Se l'utente seleziona Non chiedere più (oppure rifiuta due volte), il sistema non mostra più la finestra di dialogo. L'unica possibilità è indirizzarlo alle impostazioni dell'app, dove potrà abilitarla manualmente.

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

Usare Accompanist Permissions

La libreria accompanist-permissions racchiude tutto questo in uno stato adatto a Compose. rememberMultiplePermissionsState tiene traccia dello stato delle autorizzazioni e mette a disposizione una chiamata 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")
    }
}

Regole per la geolocalizzazione in background

La geolocalizzazione in background richiede un flusso in due passaggi: prima conceda l'autorizzazione per l'uso in primo piano (precisa/approssimativa), quindi richieda separatamente ACCESS_BACKGROUND_LOCATION, che su Android 11+ apre le impostazioni di sistema. Il Play Store richiede una motivazione chiara e un'informativa sulla privacy.

La richieda solo se la Sua app ha realmente bisogno della posizione quando è chiusa: per esempio per il geofencing o il monitoraggio dell'attività fisica.

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

Una mappa soggetta ad autorizzazione

Colleghi tutti gli elementi: mostri la mappa in base allo stato dell'autorizzazione. Mostri la mappa solo dopo che l'autorizzazione è stata concessa; in caso contrario, visualizzi una richiesta. Questo è l'approccio standard e rispettoso dell'utente.

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

Verifica rapida

A partire da Android 12, l'utente può scegliere la posizione Approssimativa invece di quella Precisa. Che cosa comporta questo per la richiesta?

Riepilogo

Ora sa come richiedere la posizione in modo responsabile:

  • Dichiari le autorizzazioni per la posizione approssimativa/precisa (e quella in background solo se essenziale) nel manifest.
  • Le richieda durante l'esecuzione con le Activity Result API o con accompanist-permissions.
  • Richieda insieme la posizione precisa e approssimativa per supportare il selettore preciso/approssimativo.
  • Mostri una motivazione e indirizzi alle impostazioni dell'app gli utenti che hanno negato definitivamente l'autorizzazione.
  • Gestisca la posizione in background come un flusso separato in due passaggi, con una motivazione giustificata.

Con questo si conclude Maps & Location Services: ora può mostrare una mappa, trovare l'utente, posizionare marcatori e richiedere l'autorizzazione nel modo corretto.

Gratis per iniziare

Impara Kotlin con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
36
Lezioni
152

Domande Frequenti

La lezione «Gestire correttamente i permessi di posizione» è gratuita?

Sì — il testo completo di «Gestire correttamente i permessi di posizione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Android Academy, passa a CoddyKit PRO. Il corso Android Academy include 4 lezioni in totale.

Cosa imparerò in «Gestire correttamente i permessi di posizione»?

Posizione in primo piano e precisa Eserciti Android Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Android Academy?

Non è richiesta alcuna esperienza precedente. Android Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Gestire correttamente i permessi di posizione»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Android Academy?

Sì. Ogni lezione Android Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Mostrare una mappa
  2. Ottenere la posizione dell'utente
  3. Marcatori e videocamera
  4. Gestire correttamente i permessi di posizione
← Torna a Android Academy