我的应用直接连接到充当接入点的硬件设备(无法访问互联网)。
我无法连接因为Android 5.0自动切换到有效的互联网连接,所以如果我有数据连接(3G,4G,...)或预先配置的网络,我无法连接到我的设备,因为它忽略了WiFi。
那么我如何强制Android使用我以编程方式激活的网络?
我只是在使用:
wifiManager.enableNetwork(id, true))
其中id
是我要连接的设备的网络。 true
参数无用。
使用ConnectivityManager.requestNetwork()
的建议解决方案无效。
答案 0 :(得分:8)
您可以尝试使用新的Lollipop API ConnectivityManager.requestNetwork(),如下所示:
ConnectivityManager cm = (ConnectivityManager) Context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.requestNetwork(new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier("XX:XX:XX:XX:XX:XX")
.build(),
new ConnectivityManager.NetworkCallback() {
void onAvailable(Network network) {
}
});
其中XX:XX:XX:XX:XX:XX
是您的WiFi SSID。我不确定它的格式,如果它完全被使用,我在Android源代码中找不到setNetworkSpecifier
的任何引用,除了NetworkCapabilities
类。
答案 1 :(得分:7)
我找到了一种解决方法,可以在Lollipop上启用所需的网络:
WifiConfiguration enable network in Lollipop
现在这是我调用wifiManager.enableNetwork(id, true)
后的代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
List<WifiConfiguration> networks = wm.getConfiguredNetworks();
Iterator<WifiConfiguration> iterator = networks.iterator();
while (iterator.hasNext()) {
WifiConfiguration wifiConfig = iterator.next();
if (wifiConfig.SSID.replace("\"", "").equals(wc.SSID.replace("\"", "")))
wm.enableNetwork(wifiConfig.networkId, true);
else
wm.disableNetwork(wifiConfig.networkId);
}
wm.reconnect();
}
也许秘密就是致电reconnect()
,我此时此刻不知道。
<强>更新强> 遗憾的是,只有在执行代码之前有效的WiFi连接处于活动状态时,此解决方法才有效。如果您仅通过3G连接,则无效。
2015年1月19日更新
此代码在Android 5 / 6.0.x上实际适用于我:
//bind to current thread
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
connManager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
ConnectivityManager.setProcessDefaultNetwork(network);
//...
}
});
}
答案 2 :(得分:0)
只需要正确格式化SSID即可。以下是示例代码:
WifiManager mWifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE);
WifiConfiguration tmpConfig = new WifiConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
tmpConfig.SSID = String.format("\"%s\"", sSSID);
tmpConfig.BSSID = sBSSID;
} else {
tmpConfig.SSID = "\"" + sSSID + "\"";
tmpConfig.BSSID = "\"" + sBSSID + "\"";
}
tmpConfig.priority = 1;
if (iSecurityType.equals("WEP")) {
tmpConfig.wepKeys[0] = sPassword;
tmpConfig.wepTxKeyIndex = 0;
} else if (iSecurityType.equals("WPA2") || iSecurityType.equals("WPA")) {
tmpConfig.preSharedKey = "\"" + sPassword+ "\"";
} else {
tmpConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
}
tmpConfig.status = WifiConfiguration.Status.ENABLED;
int netId = mWifiManager.addNetwork(tmpConfig);
mWifiManager.updateNetwork(tmpConfig);
boolean result = mWifiManager.enableNetwork(netId, true);
mWifiManager.updateNetwork(tmpConfig);
mWifiManager.saveConfiguration();