API de sugerencias de Wi-Fi para la conectividad a Internet

Los dispositivos que ejecutan Android 10 (nivel de API 29) y versiones posteriores permiten que tu app agregue credenciales de red para que un dispositivo se conecte automáticamente a un punto de acceso Wi-Fi. Puedes proporcionar sugerencias sobre a qué red conectarte usando WifiNetworkSuggestion. En última instancia, la plataforma elige el punto de acceso que desea aceptar en función de las entradas de tu app y de otras.

El siguiente ejemplo de código muestra cómo proporcionar credenciales para una red abierta, una WPA2 y una WPA3:

Kotlin

val suggestion1 = WifiNetworkSuggestion.Builder()
        .setSsid("test111111")
        .setIsAppInteractionRequired() // Optional (Needs location permission)
        .build()

val suggestion2 = WifiNetworkSuggestion.Builder()
        .setSsid("test222222")
        .setWpa2Passphrase("test123456")
        .setIsAppInteractionRequired() // Optional (Needs location permission)
        .build()

val suggestion3 = WifiNetworkSuggestion.Builder()
        .setSsid("test333333")
        .setWpa3Passphrase("test6789")
        .setIsAppInteractionRequired() // Optional (Needs location permission)
        .build()

val suggestionsList = listOf(suggestion1, suggestion2, suggestion3)

val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager

val status = wifiManager.addNetworkSuggestions(suggestionsList);
if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
    // do error handling here
}

// Optional (Wait for post connection broadcast to one of your suggestions)
val intentFilter = IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);

val broadcastReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (!intent.action.equals(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {
            return;
        }
        // do post connect processing here
    }
};
context.registerReceiver(broadcastReceiver, intentFilter);

Java

final WifiNetworkSuggestion suggestion1 =
  new WifiNetworkSuggestion.Builder()
  .setSsid("test111111")
  .setIsAppInteractionRequired() // Optional (Needs location permission)
  .build()

final WifiNetworkSuggestion suggestion2 =
  new WifiNetworkSuggestion.Builder()
  .setSsid("test222222")
  .setWpa2Passphrase("test123456")
  .setIsAppInteractionRequired() // Optional (Needs location permission)
  .build()

final WifiNetworkSuggestion suggestion3 =
  new WifiNetworkSuggestion.Builder()
  .setSsid("test333333")
  .setWpa3Passphrase("test6789")
  .setIsAppInteractionRequired() // Optional (Needs location permission)
  .build()

final List<WifiNetworkSuggestion> suggestionsList =
  new ArrayList<WifiNetworkSuggestion> {{
    add(suggestion1);
    add(suggestion2);
    add(suggestion3);
  }};

final WifiManager wifiManager =
  (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

final int status = wifiManager.addNetworkSuggestions(suggestionsList);
if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
// do error handling here…
}

// Optional (Wait for post connection broadcast to one of your suggestions)
final IntentFilter intentFilter =
  new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);

final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    if (!intent.getAction().equals(
      WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {
      return;
    }
    // do post connect processing here...
  }
};
context.registerReceiver(broadcastReceiver, intentFilter);

Las sugerencias de la app deben ser aprobadas por el usuario antes de que la plataforma inicie una conexión con ellas. Esta aprobación es proporcionada por el usuario en respuesta a una notificación la primera vez que la plataforma encuentra una red que coincide con una de las sugerencias de la app en los resultados de búsqueda. Cuando la plataforma se conecta a una de las sugerencias de red, la configuración muestra un texto que atribuye la conexión de red a la app que realizó la sugerencia correspondiente.

Cómo administrar desconexiones del usuario

Si el usuario utiliza el selector Wi-Fi para desconectarse explícitamente de una de las sugerencias de red cuando se conecta a ella, entonces se agregará esa red a una lista negra durante 24 horas. Durante ese período, no se considerará la red para la autoconexión, incluso si la app quita y vuelve a agregar la sugerencia correspondiente a la red.

Cómo cambiar el estado de autorización para una app

Un usuario que rechaza la notificación de sugerencias de red quita el permiso CHANGE_WIFI_STATE de la app. El usuario puede conceder esta aprobación posteriormente accediendo al menú de control de Wi-Fi (Configuración > Apps y notificaciones > Acceso especial a apps > Control de Wi-Fi > Nombre de la app).