Android 10 wifi连接无法到达网关

时间:2020-08-03 09:36:05

标签: android android-studio android-wifi android-10.0 wifi

我尝试制作一个简单的应用程序,将智能手机连接到指定的wifi网络,并通过闪烁QR代码重定向到显示连接到wifi网络的网络服务器的Web视图。

当我刷新我的QR码(简单的Wifi QR码)时,应用会询问我是否要连接到wifi网络,请确认并重定向到Web视图,但Web视图为空白...看起来像我我已连接到wifi,但无法访问网络...

我的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" />

编辑:我的手机是带有Android 10的Samsung Galaxy S20 Ultra

我安装了Network Analyzer应用程序,它确认我没有真正连接到wifi网络。

手动连接到wifi网络:

Screenshot Network Analyzer Manualy connected to wifi

通过扫描“我的应用”中的QR码进行连接:

Screenshot Succes QR Code scan, confirm connection

Screenshot wifi settings actual network Connected via My App

Screenshot Network Analyzer connected to wifi via My App

我们可以看到它好像已连接到wifi网络,但它没有提供我的IP地址,而且我无法ping通我的Web服务器...

我需要在AndrooidManifest中获得更多权限吗?

我不明白为什么当我使用我的应用程序连接到wifi网络时出现此问题...我尝试使用其他wifi网络,这是相同的。 我完全陷入困境,在论坛上找不到任何解决方案...

如果有人可以帮助我, 对不起我的英语不好... 谢谢,

1 个答案:

答案 0 :(得分:1)

我终于找到了解决方案,只需要添加一行代码,告诉应用程序将进程绑定到您刚刚连接的wifi网络即可。

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);

}