强制Android使用没有互联网的Wifi网络

Lon*_*275 29 networking android wifi access-point iot

我正在构建一个Android应用程序,需要通过无法访问互联网的WiFi网络进行通信.问题是,即使连接WiFi,当wifi网络上没有连接互联网时,机器人选择使用蜂窝/移动数据.

我已经阅读了许多关于该问题的帖子,其中许多涉及生根设备,但生产应用程序无法实现这一点(根设备不是一种选择).其他解决方案(如我的代码bellow)建议使用bindProcessToNetwork()哪个在我的Sony Z2上完美运行,但在我测试的其他设备上没有(所有运行6.0.1)

private void bindToNetwork() {
    final ConnectivityManager connectivityManager = (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkRequest.Builder builder;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        builder = new NetworkRequest.Builder();
        //set the transport type do WIFI
        builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
        connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(Network network) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {


                    connectivityManager.bindProcessToNetwork(null);
                    if (barCodeData.getSsid().contains("screenspace")) {
                        connectivityManager.bindProcessToNetwork(network);
                    }

                } else {
                    //This method was deprecated in API level 23
                    ConnectivityManager.setProcessDefaultNetwork(null);
                    if (barCodeData.getSsid().contains("screenspace")) {

                        ConnectivityManager.setProcessDefaultNetwork(network);
                    }
                }

                connectivityManager.unregisterNetworkCallback(this);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

lax*_*089 4

您可以通过将 captive_portal_detection_enabled 设置为 0 (false) 来解决此问题。

实际情况是,默认情况下,每次连接到 wifi 时,固件都会对服务器(通常是 google)进行测试,看看它是否是强制 wifi(需要登录)。所以如果你的wifi没有连接到google,这个检查就会失败。之后,设备知道 wifi 没有互联网连接,并且不会自动连接到它。

将此设置设置为 0 将避免此检查。

以编程方式: Settings.Global.putInt(getContentResolver(), Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 0);

编辑:您可能需要直接使用字符串“captive_portal_detection_enabled”,而不是根据 Android 版本不可见的常量。

  • 这需要 android.permission.WRITE_SECURE_SETTINGS 这是不可用的。我在问题中指出,轮换也不是一种选择。http://stackoverflow.com/a/13045819/1685748 (4认同)