En los dispositivos Android 10 (nivel de API 29) y versiones posteriores, puedes utilizar una nueva API entre pares para iniciar la configuración de dispositivos secundarios como Chromecast y hardware de Google Home. Esta función permite que tu app le pida al usuario que cambie el punto de acceso al que está conectado el dispositivo utilizando WifiNetworkSpecifier
para describir las propiedades de una red solicitada.
Para usar esta API, haz lo siguiente:
Crea un especificador de red Wi-Fi usando
WifiNetworkSpecifier.Builder
.Configura un filtro de red para que coincida con las redes a las que te conectarás, junto con las credenciales necesarias.
Decide entre una combinación de
SSID
,SSID pattern
,BSSID
yBSSID pattern
para establecer el filtro de red en cada solicitud, lo que estará sujeto a los siguientes requisitos:- Cada solicitud debe proporcionar al menos un valor de
SSID
,SSID pattern
,BSSID
oBSSID pattern
- Cada solicitud solo puede establecer un valor de
SSID
oSSID pattern
- Cada solicitud solo puede establecer un valor de
BSSID
oBSSID pattern
- Cada solicitud debe proporcionar al menos un valor de
Agrega los especificadores a la solicitud de red junto con una instancia de
NetworkCallback
para hacer un seguimiento del estado de la solicitud.Si el usuario acepta la solicitud y la conexión a la red es correcta, se invoca a
NetworkCallback.onAvailable()
en el objeto de devolución de llamada. Si el usuario la rechaza y la conexión a la red es incorrecta, se invoca aNetworkCallback.onUnavailable()
en el objeto de devolución de llamada.
Cuando se inicia la solicitud de conexión a un dispositivo par, se abre un cuadro de diálogo en el mismo dispositivo, desde el que el usuario puede aceptar la solicitud de conexión.
Cómo anular la aprobación del usuario
Una vez que el usuario aprueba una red a la que puede conectarse en respuesta a la solicitud de una app específica, el dispositivo almacena la aprobación para el punto de acceso específico. Si la app solicita específicamente conectarse de nuevo a ese punto de acceso, el dispositivo omitirá la fase de aprobación del usuario y se conectará a la red de forma automática. Si el usuario decide olvidar la red mientras está conectado a una red solicitada por la API, se quitará la aprobación almacenada para esa combinación de app y red, y el usuario deberá volver a aprobar cualquier solicitud futura de la app. Si la app realiza una solicitud no específica, como con un patrón SSID o BSSID, entonces el usuario deberá aprobarla.
Ejemplo de código
El siguiente ejemplo de código muestra cómo conectarse a una red abierta con un prefijo SSID de "test"
y un BSSID OUI 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);