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 redes credenciales para que un dispositivo se conecte automáticamente a un punto de acceso Wi-Fi. Puedes proporcionar sugerencias sobre la red a la que conectarse WifiNetworkSuggestion En última instancia, la plataforma elige qué punto de acceso aceptar según el la entrada de tu app y otras.

En Android 11 (nivel de API 30) y versiones posteriores, haz lo siguiente:

  • El framework aplica los requisitos de propiedad para las empresas basadas en EAP-SIM sugerencias (EAP-SIM, EAP-AKA, EAP-AKA-PRIME) esas sugerencias lo permiten solo las apps firmadas por el operador.
  • Para las sugerencias proporcionadas por una app firmada por el proveedor, el framework les asigna un ID de operador que corresponde al firma del operador. Tales las sugerencias se inhabilitan automáticamente si se quita la SIM correspondiente del dispositivo.

En Android 12 (nivel de API 31) y versiones posteriores, haz lo siguiente:

  • La privacidad adicional puede habilitarse mediante la aleatorización de MAC no persistente. que periódicamente vuelve a aleatorizar la dirección MAC aleatoria. Usa setMacRandomizationSetting. para especificar el nivel de aleatorización de tu red.

  • isPasspointTermsAndConditionsSupported():Términos y condiciones es una función de Passpoint que permite que las implementaciones de redes reemplacen portales cautivos no seguros, que usan redes abiertas, por una red segura de Passpoint. Se le muestra una notificación al usuario cuando debe aceptar términos y condiciones. Las apps que sugieren redes de Passpoint que están restringidas por términos y condiciones deben llamar primero a esta API para asegurarse de que el dispositivo admita la función. Si el dispositivo no la admite, no podrá conectarse a esta red, y se sugerirá una red alternativa o heredada.

  • isDecoratedIdentitySupported(): Cuando te autenticas en redes extendidas con un prefijo, el prefijo con identidad extendido permite que los operadores de red actualicen el identificador de acceso a la red (NAI) para realizar el enrutamiento explícito a través de varios proxies dentro de una red AAA (consulta RFC 7542 para obtener más información al respecto).

    Android 12 implementa esta función a fin de cumplir con la especificación de WBA para extensiones PPS-MO. Las apps que sugieren redes de Passpoint que requieren una identidad extendida deben llamar primero a esta API para asegurarse de que el dispositivo admita la función. Si el dispositivo no la admite, la identidad no se extenderá, y es posible que falle la autenticación en la red.

Para crear una sugerencia de Passpoint, las apps deben usar las clases PasspointConfiguration, Credential y HomeSp. Estas clases describen el perfil de Passpoint, que se define en la especificación de Passpoint de Wi-Fi Alliance.

En la siguiente muestra de código, se indica cómo proporcionar credenciales para un WPA2, una red WPA3 y una red de Passpoint:

Kotlin

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

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

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

val passpointConfig = PasspointConfiguration(); // configure passpointConfig to include a valid Passpoint configuration
val suggestion4 = WifiNetworkSuggestion.Builder()
        .setPasspointConfig(passpointConfig)
        .setIsAppInteractionRequired(true) // Optional (Needs location permission)
        .build();

val suggestionsList = listOf(suggestion1, suggestion2, suggestion3, suggestion4);

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(true) // Optional (Needs location permission)
  .build();

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

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

final PasspointConfiguration passpointConfig = new PasspointConfiguration();
// configure passpointConfig to include a valid Passpoint configuration

final WifiNetworkSuggestion suggestion4 =
  new WifiNetworkSuggestion.Builder()
  .setPasspointConfig(passpointConfig)
  .setIsAppInteractionRequired(true) // Optional (Needs location permission)
  .build();

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

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

Inmediatamente después de que la app realiza una sugerencia por primera vez, el usuario notificaciones. El tipo de notificación depende de la versión de Android que se ejecute en el dispositivo:

  • En Android 11 (nivel de API 30) y versiones posteriores, el usuario ve un diálogo si la app está que se ejecuta en primer plano, y una notificación si la app se ejecuta en el en segundo plano.
  • En Android 10 (nivel de API 29), el usuario ve una notificación, independientemente de ya sea que la app se ejecute en primer o segundo plano.

Cuando la plataforma se conecta a una de las sugerencias de red, se muestra la configuración texto que atribuye la conexión de red a la app de sugerencia correspondiente.

Cómo administrar desconexiones del usuario

Si el usuario utiliza el selector de Wi-Fi para desconectarse explícitamente de uno de los sugerencias de red cuando se conecte a ella, se ignorará la red cuando sigue dentro del rango. Durante este período, no se considerará esa red para la conexión automática, incluso si la app quita y vuelve a agregar la sugerencia de red correspondiente a la red. Si el usuario utiliza el selector de Wi-Fi para indicar explícitamente conectarte a una red que se desconectó previamente, entonces, esa red se la conexión automática inmediata.

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

Un usuario que rechaza la notificación de la sugerencia de red quita la CHANGE_WIFI_STATE de la app. El usuario puede otorgar esta aprobación más tarde en el menú de control de Wi-Fi (Configuración > Aplicaciones y notificaciones > Aplicación especial acceso > Control de Wi-Fi > App name).