WifiNetworkSpecifier обойти выбор пользователя - PullRequest
4 голосов
/ 29 мая 2020

Я пытаюсь реализовать одноранговую сеть WiFi, как описано в документации:

https://developer.android.com/guide/topics/connectivity/wifi-bootstrap

Я делаю это, чтобы приложение для будущего, более старая версия приложения просто добавила Wifinetwork без каких-либо проблем, но сейчас это устарело, поэтому я пытаюсь использовать новый метод для устройств, работающих под управлением Android 10.

Вот мой код (вызывается из службы переднего плана):

 if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {
            WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();

            builder.setBssid(MacAddress.fromString("00:08:22:C0:9F:4A"));
            builder.setWpa2Passphrase("password");

            WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();
            NetworkRequest.Builder networkRequestBuilder = new NetworkRequest.Builder();
            networkRequestBuilder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
            networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
            networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED);
            networkRequestBuilder.setNetworkSpecifier(wifiNetworkSpecifier);

            NetworkRequest networkRequest = networkRequestBuilder.build();
            final ConnectivityManager cm = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
            if (cm != null) {
                cm.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback() {
                    @Override
                    public void onAvailable(@NonNull Network network) {
                        //Use this network object to Send request.
                        //eg - Using OkHttp library to create a service request
                        InetAddress server = cm.getLinkProperties(network).getDnsServers().get(0);
                        Log.d(TAG,"Got the following address: "+server.getHostAddress());



                        super.onAvailable(network);
                    }
                });

            }
        }

Это действительно работает так, как ожидалось, оно показывает пользователю диалог с доступной сетью, и пользователь может выбрать ее, затем я получаю обратный вызов и получаю доступ к сеть, как мне нужно. Как только моя служба переднего плана останавливается, соединение Wi-Fi разрывается, и это именно то, что ему нужно.

Однако в следующий раз, когда я пытаюсь подключиться, я получаю то же окно, предлагающее пользователю выбрать сеть, но на основе документации отсюда: https://developer.android.com/guide/topics/connectivity/wifi-bootstrap#bypass -approval , если я не забыл сеть, пока я был подключен к ней, и не использовал шаблон для BSSID или SSID, это следует помнить и одобрение пользователя следует игнорировать. Что мне не хватает, почему я продолжаю получать окно утверждения пользователя?

Я думал, что это может быть что-то ограниченное Activity / Service, но у меня такое же поведение, даже если я вызываю это из Activity.

1 Ответ

1 голос
/ 01 июня 2020

Нашел проблему, вопрос. Это может быть мой английский sh или документация, которая не была очевидна.

Если приложение выполняет неуказанный запрос c, например, с шаблоном SSID или BSSID, то пользователь должен утвердить запрос.

Это означает что должны быть установлены как SSID, так и BSSID. Отказ от установки BSSID эквивалентен установке шаблона BSSID. Я понял это, когда зашел в построитель NetworkRequest. Чтобы приложение снова автоматически подключалось к сети, вам необходимо также установить оба значения SSID и BSSID.

...