Соединение Android Q Wifi через WifiNetworkSpecifier теряет соединение сразу после установления соединения

Я сейчас пытаюсь подключиться к сети Wi-Fi. Я использовал приведенный ниже код.

        WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
                .setSsid(ssid)
                .setBssid(MacAddress.fromString(bssid))
                .setWpa2Passphrase(password)
                .build();

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

        ConnectivityManager manager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);

        manager.requestNetwork(request, new ConnectivityManager.NetworkCallback() {

            @Override
            public void onAvailable(@NonNull Network network) {
                ConnectivityManager.setProcessDefaultNetwork(network);
                super.onAvailable(network);
                NetworkInfo info = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
                if (info != null && info.isConnectedOrConnecting()) {
                    if (!emitter.isDisposed()) {
                        emitter.onSuccess(true);
                    }
                } else {
                    if (!emitter.isDisposed()) {
                        emitter.onError(new RuntimeException("OS Disconnected"));
                    }
                }

            }

            @Override
            public void onUnavailable() {
                super.onUnavailable();
                if (!emitter.isDisposed()) {
                    emitter.onError(new RuntimeException("Could not connect Wifi"));
                }
            }
        });
    });

проблема: приведенный выше код хорошо работает с телефоном Pixel и Nokia, но на устройствах Oneplus я получаю тост об успешном подключении и сразу после отключения этого Wi-Fi. Символ Wi-Fi очень кратковременно отображается в строке состояния. В следующий момент символ Wi-Fi исчезнет, ​​и снова появится системный диалог для подключения к Wi-Fi.

Ниже предоставлены разрешения, разрешение на местоположение предоставляется, и оно также включено на устройстве.

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>

Когда я отлаживаю обратный вызов, он использует методы в этом порядке:

  1. onAvailable ()
  2. onCapabilitiesChanged ()
  3. onBlockedStatusChanged (заблокировано: ложь)
  4. onCapabilitiesChanged ()
  5. onLost ()

Я уже ссылался на эти Android Q, программно подключиться к другой точке доступа Wi-Fi для Интернета
WiFi Сетевое соединение продолжает отключаться на Android Q Wi-Fi Проблема с подключением Api сетевого запроса в android 10 (Q) Android Q, WifiNetworkSpecifier теряет Wi-Fi сразу после установления соединения

и я не мог найти решение.

Есть ли что-то, что мне не хватает в сетевом запросе, что вызывает отключение? или любое другое решение по достоинству.

Спасибо.


person Jayanth    schedule 12.03.2020    source источник
comment
Фу. У вас есть конкретная модель (или модели) OnePlus, которая демонстрирует такое поведение?   -  person CommonsWare    schedule 12.03.2020
comment
Я пробовал с 4 разными моделями из этих 3 устройств OnePlus 6t с ОС Android 10 и одного OnePlus 7 pro с Android 10, все вели себя одинаково.   -  person Jayanth    schedule 12.03.2020
comment
Пожалуйста, проверьте ссылку ниже, - форумы .oneplus.com / themes / - issueetracker.google.com/issues/143549613   -  person Krunal Indrodiya    schedule 23.04.2020
comment
Эта проблема произошла со мной и расстроила меня. Я тестировал Samsung s10, много искал и ничего не нашел. Затем я попробовал другое устройство и обнаружил, что оно работает как шарм. Я искал устройства Samsung S10, если у них есть проблема, кажется, что с момента обновления Android 10 появилось много проблем. Если вы используете S10, проверьте следующую ссылку (у меня работает третье решение): thedroidguy.com/   -  person Mohammad Sayed    schedule 14.07.2020
comment
У меня такая же проблема. Тестировал на Samsung S9 + и планшете Galaxy S6. У обоих одна и та же проблема. Подключитесь к выбранному SSID Wi-Fi (как указано в спецификаторе), обратный вызов перейдет в onAvailable и будет «подключен», но немедленно отключается. Оба являются API 29. (Q, 10) Я пробовал много комбинаций модификаторов запроса в соответствии с многочисленными ответами SO. Я использовал 3 разных подключения Wi-Fi, 2 на маршрутизаторе (wep и wpa) и одно от мини-точки доступа D1. Пока ничего не работает. Все исследования в документах, онлайн-форумах и здесь, на SO, пока ни к чему не привели.   -  person Eric Engel    schedule 13.11.2020


Ответы (4)


По состоянию на сентябрь 2020 года эта проблема все еще не решена на некоторых устройствах: Oneplus 6, телефоны Nokia и т. Д., Похоже, демонстрируют этот цикл успешного подключения. В то же время, если у вас есть устройство iOT, ваше приложение пытается автоматически подключиться, и оно не работает, вы можете попробовать это в onFail (), чтобы закрыть диалоговое окно подключения и изящно перенаправить пользователей на страницу Wi-Fi для подключения вручную.

        connectivityManager.bindProcessToNetwork(null);
        connectivityManager.unregisterNetworkCallback(networkCallback);
        AlertDialog.Builder alert = new AlertDialog.Builder(...);
        alert.setTitle(...);
        alert.setMessage(...);
        alert.setPositiveButton("OK",
          new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
              Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
              intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              context.startActivity(intent);
            }
          });
        alert.show();
      }
person rampency    schedule 09.09.2020
comment
Я тестирую телефон Nokia, и у меня возникает этот цикл подключения. Однако это произойдет, только если я позвоню connectivityManager.unregisterNetworkCallback(networkCallback). Если я не отменю регистрацию обратного вызова, телефон останется подключенным к Wi-Fi. Не совсем понимаю, почему ... - person Hayuki; 10.11.2020

Поздно к разговору, но пробовали ли вы звонить connectivityManager.bindProcessToNetwork(network) всякий раз, когда находите доступную сеть?

Вот пример того, что я имею в виду на основе кода вашего вопроса:

WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
                .setSsid(ssid)
                .setBssid(MacAddress.fromString(bssid))
                .setWpa2Passphrase(password)
                .build();

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

        ConnectivityManager manager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);

        manager.requestNetwork(request, new ConnectivityManager.NetworkCallback() {

            @Override
            public void onAvailable(@NonNull Network network) {
                super.onAvailable(network);

                // This is the new line of code
                ConnectivityManager.bindProcessToNetwork(network);

                NetworkInfo info = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
                if (info != null && info.isConnectedOrConnecting()) {
                    if (!emitter.isDisposed()) {
                        emitter.onSuccess(true);
                    }
                } else {
                    if (!emitter.isDisposed()) {
                        emitter.onError(new RuntimeException("OS Disconnected"));
                    }
                }

            }
...
}
person Ivan Garza    schedule 04.03.2021
comment
ConnectivityManager.bindProcessToNetwork (сеть); решил мою проблему - person Nasser Ghodsian; 29.05.2021

Если вы пытаетесь подключиться к сети, которая не предоставляет доступ к Интернету, вместо

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

пытаться

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

Очевидно, подключение к Интернету требуется по умолчанию.

Документация (см. https://developer.android.com/reference/android/net/wifi/WifiNetworkSpecifier.Builder#build()) говорит

Создайте объект-спецификатор, используемый для запроса локальной сети Wi-Fi. Сгенерированный NetworkSpecifier следует использовать в NetworkRequest.Builder # setNetworkSpecifier (NetworkSpecifier) ​​при построении NetworkRequest. Эти спецификаторы могут использоваться только для запроса локальной сети Wi-Fi (т.е. без подключения к Интернету). Таким образом, устройство не будет переключать свой маршрут по умолчанию на Wi-Fi, если доступны другие транспортные средства (например, сотовая связь).

Я не совсем понимаю этот абзац, но он говорит о том, что устройство переключается обратно на маршрут по умолчанию, что может вызвать отключение от вашей целевой сети.

Приведенный там пример включает строку

.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)

Я скопировал пример, и он у меня сработал. Никогда не пытался установить соединение без строки выше.

Однако я только попытался подключиться к сети с подключением к Интернету. К моему удивлению, когда я попытался подключиться к одному без него, несмотря на документацию, соединение не удалось.

person jesjf    schedule 16.11.2020
comment
На каком устройстве пробовали? Я пробовал эту линию, и она не работает на моем Samsung S9 +. Пытался подключиться к моей сети, подключенной к Интернету, а также к softAP без Интернета. Ни то, ни другое не подойдет мне. - person Eric Engel; 18.11.2020
comment
Galaxy A10s. Работает, когда есть интернет, но только сейчас я отключил кабель и попробовал без интернета. В отличие от того, что сказано в документации, это не удалось. - person jesjf; 19.11.2020

Я много отслеживал и исследовал это. Все мои выводы вместе с моим наиболее оптимальным решением на данный момент можно найти здесь

Но более конкретным для вашего вопроса является следующая информация, взятая из ссылки

Как указано здесь, Google, некоторые OEM-ромы не «держатся за запрос» и поэтому соединение мгновенно разрывается. OnePlus исправила эту проблему в некоторых из своих более поздних моделей, но не во всех. Эта ошибка будет постоянно существовать для определенных моделей телефонов в определенных сборках Android, поэтому требуется успешный откат (т. Е. Подключение вручную без прерывания работы сети). Известного обходного пути нет

  • removeCapability (NetworkCapabilities.NET_CAPABILITY_INTERNET) не поможет сохранить соединение на OnePlus, как указано здесь

  • установка Bssid не поможет сохранить соединение на OnePlus, как указано здесь

  • Google не может помочь, они заявили, что это не в их руках здесь

  • Сообщения на форуме OnePlus, подтверждающие, что он работает для некоторых моделей (но не для всех) после обновления, см. здесь, здесь и здесь

person LethalMaus    schedule 05.01.2021
comment
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится. - Из отзыва - person Calculuswhiz; 05.01.2021
comment
Спасибо за информацию :) - person Jayanth; 05.01.2021