Richiedere l'autorizzazione ad accedere ai dispositivi Wi-Fi nelle vicinanze

Le app che hanno come target Android 13 (livello API 33) o versioni successive e gestiscono le connessioni Wi-Fi devono richiedere l'autorizzazione di runtime NEARBY_WIFI_DEVICES. Questa autorizzazione semplifica la giustificazione dell'accesso di un'app ai dispositivi Wi-Fi nelle vicinanze. Nelle versioni precedenti di Android, queste app dovevano dichiarare invece l'autorizzazione ACCESS_FINE_LOCATION.

L'autorizzazione fa parte del gruppo di dispositivi nelle vicinanze

L'autorizzazione NEARBY_WIFI_DEVICES fa parte del gruppo di autorizzazioni Dispositivi nelle vicinanze. Questo gruppo, aggiunto in Android 12 (livello API 31), include anche le autorizzazioni relative a Bluetooth e banda ultralarga. Quando richiedi qualsiasi combinazione di autorizzazioni da questo gruppo di autorizzazioni, il sistema mostra una singola finestra di dialogo di runtime e chiede all'utente di approvare l'accesso della tua app ai dispositivi nelle vicinanze. Nelle impostazioni di sistema, l'utente deve attivare e disattivare le autorizzazioni Dispositivi nelle vicinanze come gruppo. Ad esempio, gli utenti non possono disattivare l'accesso al Wi-Fi, ma mantenere attivo l'accesso al Bluetooth per una determinata app.

Affermare con fermezza che la tua app non ricava la posizione fisica

Quando scegli come target Android 13 o versioni successive, valuta se la tua app ricava mai i dati sulla posizione dalle API Wi-Fi. In caso contrario, devi dichiararlo con fermezza. Per fare questa affermazione, imposta l'attributo usesPermissionFlags su neverForLocation nel file manifest dell'app, come mostrato nello snippet di codice seguente. Questa procedura è simile a quella che esegui quando affermi che le informazioni sul dispositivo Bluetooth non vengono mai utilizzate per la posizione:

<manifest ...>
    <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
                     android:usesPermissionFlags="neverForLocation" />
    <application ...>
        ...
    </application>
</manifest>

Le versioni precedenti e alcune API richiedono l'autorizzazione di accesso alla posizione

Diverse API Wi-Fi richiedono l'autorizzazione ACCESS_FINE_LOCATION, anche quando la tua app ha come target Android 13 o versioni successive. Alcuni esempi sono i seguenti metodi della classe WifiManager:

Inoltre, poiché l'autorizzazione NEARBY_WIFI_DEVICES è disponibile solo su Android 13 e versioni successive, devi mantenere le dichiarazioni per ACCESS_FINE_LOCATION per garantire la compatibilità con le versioni precedenti nella tua app. Tuttavia, a condizione che la tua app non si basi su informazioni sulla posizione precise, puoi impostare la versione SDK massima di questa autorizzazione su 32, come mostrato nel seguente snippet di codice:

<manifest ...>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
                     android:maxSdkVersion="32" />
    <application ...>
        ...
    </application>
</manifest>

Verificare le API che richiedono l'autorizzazione

Se la tua app ha come target Android 13 o versioni successive, devi dichiarare l'autorizzazione NEARBY_WIFI_DEVICES per chiamare una delle seguenti API Wi-Fi:

Workflow di accesso al Wi-Fi

La Figura 1 mostra il flusso di lavoro di accesso al Wi-Fi sui dispositivi con Android 13 o versioni successive, per le app che hanno come target Android 13 o versioni successive. Tieni presente che, a condizione di dichiarare che la tua app non ricava la posizione fisica dalle informazioni del dispositivo Wi-Fi, non è più necessario dichiarare l'autorizzazione ACCESS_FINE_LOCATION:

Figura 1. Diagramma di flusso per determinare se un'app che ha come target Android 13 (livello API 33) o versioni successive può accedere alle informazioni sul Wi-Fi.

La Figura 2 mostra il flusso di lavoro per l'accesso al Wi-Fi sui dispositivi con Android 12L o versioni precedenti. Tieni presente che è necessaria l'autorizzazione ACCESS_FINE_LOCATION.

Figura 2. Diagramma di flusso per determinare se un'app che ha come target 12L (livello API 32) o versioni precedenti può accedere alle informazioni sul Wi-Fi.