如何使用NetworkRequest.Builder()指定wifi网络.setNetworkSpecifier(string)

时间:2015-12-23 10:35:06

标签: android networking android-wifi captiveportal

我正在寻找一种让Android 5.0平板电脑连接到内部网的方法,出于安全考虑,它没有互联网连接。

问题是谷歌自4.4 / 5.0以来在Android中构建的强制门户保护。 呼叫android connectivitycheck以检查互联网连接,当此呼叫失败时,wifi网络被标记为不工作并避免。很蹩脚。

其他人遇到了同样的问题,有些人建议使用android 5中引入的新API,请参阅: Android 5.0 Lollipop and 4.4 KitKat ignores my WiFi network, enableNetwork() is useless

关于此的文件非常模糊:

NetworkRequest.Builder.setNetworkSpecifier(String  networkSpecifier)

“此字符串的解释是特定于承载者,使用它的承载者应记录其详细信息。例如,蓝牙可能使用某种设备ID,而WiFi可能使用ssid和/或bssid。蜂窝可能使用载体SPN“

我尝试过这个并不起作用。主要问题是,一旦我使用setNetworkSpecifier(),就找不到网络。我尝试使用AP的bssid(mac)和ssid

看起来过滤器正在运行,但不清楚它应该如何工作。 如果我遗漏了setNetworkSpecifier()呼叫1网络,但无法确定哪个网络。至少它显示我的代码有效。

那么如果ssid和bssid不起作用,我应该在这里放什么?

这是我的代码。

 private void connect(String ssid, Context context) {
    Log.i(TAG, "try connect to! " + ssid);
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkRequest nr = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).
                removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED).
                removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET

                setNetworkSpecifier(ssid). //<--- here is the problem
                build();
        ConnectivityManager.NetworkCallback callback 
             = new ConnectivityManager.NetworkCallback() {
                @Override
                public void onAvailable(Network network) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        Log.i(TAG, "onAvailable " + network.toString() + " " + network.getClass().getName());
                }
            }

            @Override
            public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
                try {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        Log.i(TAG, "onCapabilitiesChanged " + networkCapabilities.getLinkDownstreamBandwidthKbps());
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
                try {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        Log.i(TAG, "onLinkPropertiesChanged " + linkProperties.getInterfaceName());
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        Log.i(TAG, "requestNetwork ");
        // cm.requestNetwork(nr, callback);
        cm.registerNetworkCallback(nr, callback);
    }
}

2 个答案:

答案 0 :(得分:4)

我在Android Studio中调试了在Samsung S5(SM-G900V),API 23(6.0.1)上运行的以下代码。

void inspectNetworks() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        Network[] ns = connectivity.getAllNetworks();
        for (Network n : ns) {
            NetworkCapabilities c = connectivity.getNetworkCapabilities(n);
            Log.i(TAG, "inspectNetworks: network="+n+" capabilities="+c); // <- breakpoint
        }
    }
}

我发现Wi-Fi网络根本没有networkSpecifier

in Android Studio Debug view, mNetworkSpecifier = null

networkSpecifier可能WIFI - 未来将实施传输网络...为了记录,我发现networkSpecifier 设置为对于现有的1 - 传输网络,此特定电话上CELLULAR

就目前而言,在请求Wi-Fi网络时,呼叫addCapability似乎是最具体的选择。

答案 1 :(得分:0)

首先,作弊始终是一个选项,只是要求人们更改手机中的设置才能使用网络。作弊就是这样的。 Wifi-&GT;高级 - &GT;未检查

但是,我确定这不是您正在寻找的答案。所以我为你做了一点研究,找到了需要的东西。您需要调用命令ignoreNetwork()。要了解有关此命令的更多信息,请参阅以下源链接上的ACTION_CAPTIVE_PORTAL_SIGN_IN。

来源:http://developer.android.com/reference/android/net/ConnectivityManager.html#ACTION_CAPTIVE_PORTAL_SIGN_IN

http://developer.android.com/reference/android/net/CaptivePortal.html#ignoreNetwork()