我正在寻找一种方法让 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) 和ssid
AP 的。
看起来过滤器正在工作,但不清楚它应该如何工作。如果我遗漏了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);
}
}