En dispositivos con Android 10 (nivel de API 29) y versiones posteriores, puedes usar una nueva API de peer-to-peer para iniciar la configuración de dispositivos secundarios, como Chromecast y el hardware de Google Home. Esta función permite que tu app solicite al usuario que cambie el punto de acceso al que está conectado el dispositivo con WifiNetworkSpecifier para describir las propiedades de una red solicitada.
Para usar esta API, haz lo siguiente:
Crea un especificador de red Wi-Fi con
WifiNetworkSpecifier.Builder.Establece un filtro de red para que coincida con las redes a las que se conectará, junto con las credenciales necesarias.
Decide una combinación de
SSID,SSID pattern,BSSIDyBSSID patternpara establecer el filtro de red en cada solicitud, sujeto a los siguientes requisitos:- Cada solicitud debe proporcionar al menos uno de los siguientes parámetros:
SSID,SSID pattern,BSSIDoBSSID pattern - Cada solicitud puede establecer solo uno de los parámetros
SSIDoSSID pattern - Cada solicitud puede establecer solo uno de los valores
BSSIDoBSSID pattern
- Cada solicitud debe proporcionar al menos uno de los siguientes parámetros:
Agrega los especificadores a la solicitud de red junto con una instancia de
NetworkCallbackpara hacer un seguimiento del estado de la solicitud.Si el usuario acepta la solicitud y la conexión a la red se realiza correctamente, se invoca
NetworkCallback.onAvailable()en el objeto de devolución de llamada. Si el usuario rechaza la solicitud o si la conexión a la red no se realiza correctamente, se invocaNetworkCallback.onUnavailable()en el objeto de devolución de llamada.
Cuando se inicia la solicitud para conectarse a un dispositivo de par, se abre un cuadro de diálogo en el mismo dispositivo, desde el cual el usuario de ese dispositivo puede aceptar la solicitud de conexión.
Omite la aprobación del usuario
Una vez que el usuario aprueba una red para conectarse en respuesta a una solicitud de una app específica, el dispositivo almacena la aprobación para el punto de acceso en particular. Si la app realiza una solicitud específica para volver a conectarse a ese punto de acceso, el dispositivo omite la fase de aprobación del usuario y se conecta automáticamente a la red. Si el usuario elige olvidar la red mientras está conectado a una red solicitada por la API, se quita esta aprobación almacenada para esa combinación de app y red, y el usuario debe volver a aprobar cualquier solicitud futura de la app. Si la app realiza una solicitud no específica, como con un patrón de SSID o BSSID, 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 prefijo de SSID de "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);