我正在寻找一种让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);
}
}
答案 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
:
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/CaptivePortal.html#ignoreNetwork()