API de Wi-Fi Network Request para la conectividad entre pares

En dispositivos con Android 10 (nivel de API 29) y versiones posteriores, puedes usar una nueva API entre pares para realizar lo siguiente: configuración de arranque para dispositivos secundarios, como Chromecast y Google Home hardware. Esta función permite que tu app le solicite al usuario que cambie el acceso. punto al que está conectado el dispositivo mediante WifiNetworkSpecifier para describir las propiedades de una red solicitada.

Para usar esta API, haz lo siguiente:

  1. Crear un especificador de red Wi-Fi con WifiNetworkSpecifier.Builder

  2. Establece un filtro de red que coincida con las redes a las que te conectarás, junto con credenciales.

  3. Elige una combinación de SSID, SSID pattern, BSSID, y BSSID pattern para establecer el filtro de red en cada solicitud, sujeto a requisitos:

    • Cada solicitud debe proporcionar al menos uno de los valores SSID, SSID pattern o BSSID o BSSID pattern
    • Cada solicitud puede establecer solo una de las siguientes opciones: SSID o SSID pattern
    • Cada solicitud puede establecer solo una de las siguientes opciones: BSSID o BSSID pattern
  4. Agrega los especificadores a la solicitud de red junto con NetworkCallback para hacer un seguimiento del estado de la solicitud.

    Si el usuario acepta la solicitud y la conexión a la red se exitoso, NetworkCallback.onAvailable() se invoca en el objeto de devolución de llamada. Si el usuario rechaza la solicitud o si si la conexión a la red no funciona NetworkCallback.onUnavailable() se invoca en el objeto de devolución de llamada.

Cuando se inicia la solicitud para conectarse a un dispositivo de pares, se abre un cuadro de diálogo en el mismo dispositivo, desde el cual su usuario puede aceptar la solicitud de conexión.

Cómo anular la aprobación del usuario

Una vez que el usuario aprueba una red para conectarse en respuesta a una solicitud de un en una app específica, el dispositivo almacena la aprobación para ese punto de acceso específico. Si la app realiza una solicitud específica se volverá a conectar a ese punto de acceso, el dispositivo omitirá la fase de aprobación del usuario y se conecta automáticamente a la red. Si el usuario decide olvidar red mientras estás conectado a una red solicitada por la API, este almacenamiento se elimina la aprobación de esa combinación de aplicación y red, y cualquier futuro solicitud de la app debe volver a ser aprobada por el usuario. Si la aplicación realiza una solicitud no específica, como con un patrón SSID o BSSID, entonces el el usuario debe aprobar la solicitud.

Muestra de código

En la siguiente muestra de código, se indica cómo conectarse a una red abierta con un SSID. el prefijo "test" y un OUI de BSSID de "10:03:23":

Kotlin

val specifier = WifiNetworkSpecifier.Builder()
    .setSsidPattern(PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
    .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
    .build()

val request = NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .setNetworkSpecifier(specifier)
    .build()

val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

val networkCallback = object : ConnectivityManager.NetworkCallback() {
    ...
    override fun onAvailable(network: Network?) {
        // do success processing here..
    }

    override fun onUnavailable() {
        // do failure processing here..
    }
    ...
}
connectivityManager.requestNetwork(request, networkCallback)
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback)

Java

final NetworkSpecifier specifier =
  new WifiNetworkSpecifier.Builder()
  .setSsidPattern(new PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
  .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
  .build();

final NetworkRequest request =
  new NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
  .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .setNetworkSpecifier(specifier)
  .build();

final ConnectivityManager connectivityManager = (ConnectivityManager)
  context.getSystemService(Context.CONNECTIVITY_SERVICE);

final NetworkCallback networkCallback = new NetworkCallback() {
  ...
  @Override
  void onAvailable(...) {
      // do success processing here..
  }

  @Override
  void onUnavailable(...) {
      // do failure processing here..
  }
  ...
};
connectivityManager.requestNetwork(request, networkCallback);
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback);