Wi-Fi-соединение Android 10 не может достичь шлюза

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

Когда я мигаю своим QR-кодом (простой QR-код Wi-Fi), приложение спрашивает, хочу ли я подключиться к сети Wi-Fi, я подтверждаю, а затем перенаправляю на веб-просмотр, но веб-просмотр пуст ... Похоже, я подключен к Wi-Fi, но я не могу подключиться к сети...

Часть моей активности QR-кода:

public void successFlash(String ssid, String password) {

    WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
            .setSsid(ssid)
            .setWpa2Passphrase(password)
            .build();

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

    ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);


    ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {

        public void onAvailable(Network network) {
                    openActivity_redirect_webview();
        }

        @Override
        public void onUnavailable() {
            // do failure processing here..
            openQrcodeActivity();
        }

    };
    connectivityManager.requestNetwork(request, networkCallback);
}

Моя активность в веб-просмотре:

public class activity_redirect_webview extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_redirect_webview);

    webView = (WebView) findViewById(R.id.redirect_webview);
    webView.setWebViewClient(new WebViewClient());
    webView.getSettings().setLoadsImagesAutomatically(true);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);

    webView.loadUrl("http://192.168.4.1/index.html");
  }

}

Разрешение в AndroidManifest.xml

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-feature android:name="android.permission.WRITE_SETTINGS"
    android:required="false"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.wifi" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.VIBRATE" />

EDIT: Мой телефон — Samsung Galaxy S20 Ultra с Android 10.

Я устанавливаю приложение Network Analyzer, и оно подтверждает, что я на самом деле не подключен к сети Wi-Fi.

Ручное подключение к сети Wi-Fi:

Снимок экрана Анализатор сети Вручную подключен к Wi-Fi

Подключение путем сканирования QR-кода из Моего приложения:

Сканирование QR-кода выполнено успешно, подключение подтверждено

Скриншот настроек Wi-Fi: фактическая сеть, подключенная через мое приложение

Снимок экрана Network Analyzer, подключенный к Wi-Fi через приложение "Мое приложение"

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

Нужно ли мне больше разрешений в AndroidManifest??

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


person emahrv    schedule 03.08.2020    source источник
comment
Попробуйте загрузить этот URL-адрес в браузере на своем телефоне.   -  person blackapps    schedule 03.08.2020
comment
Вы не можете использовать протокол http://, если вы не запросите clearTextTraffic в файле манифеста.   -  person blackapps    schedule 03.08.2020
comment
Я пытаюсь загрузить URL-адрес в Chrome, и это то же самое, я не могу получить доступ к своему веб-серверу ... В сети нет подключения к Интернету, это что-то меняет?   -  person emahrv    schedule 04.08.2020
comment
Вы не можете использовать протокол http://, если вы не запросите clearTextTraffic в файле манифеста, что это значит?   -  person emahrv    schedule 04.08.2020
comment
Тогда ваша проблема не имеет ничего общего с Android.   -  person blackapps    schedule 04.08.2020
comment
Вам не нужно подключение к Интернету для такого локального IP-адреса, как 192.168.4.1. Какой сервер работает с таким адресом на этом устройстве? Что за устройство? Последняя цифра .1 означает, что это маршрутизатор.   -  person blackapps    schedule 04.08.2020
comment
Google использует ClearTextTraffic.   -  person blackapps    schedule 04.08.2020
comment
Если я вручную подключу свой телефон к сети Wi-Fi, я доберусь до веб-сервера в Chrome, но если я забуду сеть Wi-Fi и подключусь к сети Wi-Fi через свое приложение, я не смогу подключиться к веб-серверу, поэтому проблема в приложении. Это ESP8266 со встроенным веб-сервером.   -  person emahrv    schedule 04.08.2020
comment
В моем манифесте для useClearTextTraffic уже установлено значение True.   -  person emahrv    schedule 04.08.2020
comment
Может ли ваше приложение получить доступ к веб-серверу, если вы вручную подключите свой телефон? Вы не сообщили об этом сценарии.   -  person blackapps    schedule 04.08.2020
comment
Может ли Chrome связаться с веб-сервером, если ваше приложение подключается? Вы также не сообщили об этом сценарии.   -  person blackapps    schedule 04.08.2020
comment
Подключение вручную: Chrome хорошо достигает веб-сервера / Мое приложение хорошо достигает веб-сервера   -  person emahrv    schedule 04.08.2020
comment
Подключиться через мое приложение: Chrome не может подключиться к веб-серверу / мое приложение не может получить доступ к веб-серверу   -  person emahrv    schedule 04.08.2020
comment
В порядке. Теперь наконец все ясно. Я вообще не понял твоего поста.   -  person blackapps    schedule 04.08.2020
comment
С Android 10 соединение Wi-Fi изменилось, поэтому, когда я сканирую свой QR-код Wi-Fi, открывается небольшое окно и запрашивается устройство для нас с MyApp и показывается сеть Wi-Fi, к которой я не хочу подключаться, я должен подтвердить, затем Wi-Fi подключен а через приложение. Если я захожу в настройки Wi-Fi, я вижу, что я подключен к сети Wi-Fi, но он пишет «Подключено через MyApp», но когда я подключаюсь через приложение, я не могу получить доступ к своему веб-серверу. Если я вручную подключаюсь к сети Wi-Fi, он пишет «Подключено», и я могу подключиться к своему веб-серверу. Чего я не понимаю, так это почему, когда я подключаюсь к сети Wi-Fi через свое приложение, я не могу получить доступ к веб-серверу.   -  person emahrv    schedule 04.08.2020
comment
Извините, в данный момент я не могу попробовать ваш код.   -  person blackapps    schedule 04.08.2020
comment
У вас есть время попробовать мой код, пожалуйста? я застрял, и мне действительно нужна помощь.   -  person emahrv    schedule 13.08.2020
comment
У меня не работает ESP8266. У вас проблема только с esp или со всеми роутерами/точками доступа?   -  person blackapps    schedule 13.08.2020
comment
На вашей последней картинке Connectiontype:cell вместо первого, у кого есть Wi-Fi. Попробуйте в своем коде установить тип подключения, если это возможно.   -  person blackapps    schedule 13.08.2020
comment
Проблема со всеми роутерами/точками доступа. Да, когда я подключаюсь через свое приложение, он не переключает маршрут по умолчанию на Wi-Fi, как я могу переключиться на маршрут Wi-Fi?   -  person emahrv    schedule 13.08.2020
comment
Я не знаю. Что это: setNetworkSpecifier(specifier) ​​делает?   -  person blackapps    schedule 13.08.2020
comment
Пробую на другом телефоне без сим карты, та же проблема   -  person emahrv    schedule 13.08.2020
comment
Также ответьте на мой вопрос, пожалуйста.   -  person blackapps    schedule 13.08.2020
comment
Я нашел решение! Нашла на русском форуме. Добавьте это подключениеManager.bindProcessToNetwork(сеть); использовать Wi-Fi-соединение и не переключаться на сотовое соединение, даже если нет подключения к Интернету.   -  person emahrv    schedule 13.08.2020
comment
Спасибо за помощь @blackapps   -  person emahrv    schedule 13.08.2020
comment
На русском форуме! Здорово. Я знал, что ты француз ;-).   -  person blackapps    schedule 13.08.2020


Ответы (1)


Наконец-то я нашел решение, просто нужно добавить строку, которая сообщает приложению привязать процесс к сети Wi-Fi, к которой вы только что подключились.

connectivityManager.bindProcessToNetwork(network);

Окончательный код:

public void successFlash(String ssid, String password) {

WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
        .setSsid(ssid)
        .setWpa2Passphrase(password)
        .build();

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

ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);


ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {

    public void onAvailable(Network network) {
                connectivityManager.bindProcessToNetwork(network);
                openActivity_redirect_webview();
    }

    @Override
    public void onUnavailable() {
        // do failure processing here..
        openQrcodeActivity();
    }

};
connectivityManager.requestNetwork(request, networkCallback);

}

person emahrv    schedule 13.08.2020
comment
Привет эмарв. У меня такая же проблема, как будто Wi-Fi подключен, но нет сети. я также добавил, что bindProcessToNetwork. но не работал. не могли бы вы рассказать о других возможностях для этого? - person vijju; 05.06.2021