No Android 10 (nível 29 da API) e dispositivos mais recentes, é possível usar uma nova API ponto a ponto para
inicializar a configuração de dispositivos secundários, como o Chromecast e o hardware do
Google Home. Esse recurso permite que o app solicite que o usuário mude o ponto
de acesso ao qual o dispositivo está conectado usando
WifiNetworkSpecifier
para descrever as propriedades de uma rede solicitada.
Para usar essa API, siga as etapas abaixo:
Crie um especificador de rede Wi-Fi usando
WifiNetworkSpecifier.Builder
.Defina um filtro de rede para corresponder às redes às quais se conectar, junto com as credenciais necessárias.
Decida uma combinação de
SSID
,SSID pattern
,BSSID
eBSSID pattern
para definir o filtro de rede em cada solicitação, sujeito aos seguintes requisitos:- Cada solicitação precisa informar pelo menos um destes valores:
SSID
,SSID pattern
,BSSID
ouBSSID pattern
. - Cada solicitação pode definir apenas um destes valores:
SSID
ouSSID pattern
. - Cada solicitação pode definir apenas um destes valores:
BSSID
ouBSSID pattern
.
- Cada solicitação precisa informar pelo menos um destes valores:
Adicione os especificadores à solicitação de rede com uma instância
NetworkCallback
para rastrear o status da solicitação.Se o usuário aceitar a solicitação e a conexão com a rede for bem-sucedida,
NetworkCallback.onAvailable()
será invocado no objeto de callback. Se o usuário negar a solicitação ou se a conexão com a rede falhar,NetworkCallback.onUnavailable()
será invocado no objeto de callback.
O início da solicitação para se conectar a um dispositivo de peering abre uma caixa de diálogo no mesmo dispositivo, em que o usuário pode aceitar a solicitação de conexão.
Ignorar a aprovação do usuário
Depois que o usuário aprova uma rede para se conectar em resposta a uma solicitação de um app específico, o dispositivo armazena a aprovação para o ponto de acesso específico. Se o app fizer uma solicitação específica para se conectar a esse ponto de acesso novamente, o dispositivo vai pular a fase de aprovação do usuário e se conectar automaticamente à rede. Se o usuário optar por esquecer a rede enquanto estiver conectado a uma rede solicitada pela API, a aprovação armazenada para essa combinação de app e rede será removida, e qualquer solicitação futura do app precisará ser aprovada pelo usuário novamente. Se o app faz uma solicitação não específica, por exemplo, com um padrão SSID ou BSSID, o usuário precisa aprovar a solicitação.
Exemplo de código
O exemplo de código a seguir mostra como se conectar a uma rede aberta com um prefixo SSID de "test"
e um OUI 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);