Android 10 Wi-Fi соединение не может достичь шлюза - PullRequest
0 голосов
/ 03 августа 2020

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

Когда я fla sh мой 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" />

РЕДАКТИРОВАТЬ: Мой телефон - Samsung Galaxy S20 Ultra с Android 10

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

Подключение к сети Wi-Fi вручную:

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

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

Снимок экрана Успешное сканирование QR-кода, подтверждение подключения

Снимок экрана Настройки Wi-Fi Фактическая сеть Подключено через мое приложение

Снимок экрана Сетевой анализатор подключен к Wi-Fi через мое приложение

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

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

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

Если кто-то может мне помочь, пожалуйста, извините за мой английский sh ... Спасибо,

1 Ответ

0 голосов
/ 13 августа 2020

Я наконец нашел решение, просто нужно добавить строку, которая сообщает приложению привязать процесс к сети 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);

}

...