15

我正在寻找一种方法让 Android 5.0 平板电脑连接到出于安全原因没有 Internet 连接的 Intranet。

问题是 Google 自 4.4/5.0 以来在 android 中构建的强制门户保护。调用androidconnectivitycheck以检查互联网连接,当此调用失败时,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()没有找到网络。我尝试使用bssid(mac) 和ssidAP 的。

看起来过滤器正在工作,但不清楚它应该如何工作。如果我遗漏了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);
    }
}
4

2 回答 2

5

我在 Android Studio 的三星 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

在 Android Studio 调试视图中,mNetworkSpecifier = null

也许networkSpecifiers for WIFI-transport 网络将在未来实施...作为记录,我发现在这台特定手机上针对现有的-transport 网络networkSpecifier 设置了此项。1CELLULAR

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

于 2017-04-26T20:02:12.870 回答
-1

首先作弊始终是一种选择,只需要人们更改手机中的设置才能使用网络。骗子是这样的。Wifi->高级->未选中。

但是,我确定这不是您正在寻找的答案。所以我为你做了一些研究,找到了需要的东西。您需要调用命令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()

于 2016-02-02T15:00:25.707 回答