android - 使用华为以编程方式连接到 wifi AP
问题描述
我们正在一个连接到多个 wifi AP 的应用程序中工作。
我们发现问题的唯一设备是华为设备,具体来说就是华为 P20 PRO (Android 9.1)。
我们能够连接到不受密码保护的 wifi AP,但如果它受到保护,我们将无法与 Wifi AP 建立连接。
这是我们正在使用的代码的摘录:
private void connect(WifiConfiguration wifiAP) {
WifiManager wifi = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
SharedPreferences prefs =
context.getSharedPreferences(prefs_pass_dic, Context.MODE_PRIVATE);
String pass = prefs.getString(wifiAP.SSID.replace("\"",""), "");
WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiManager.disconnect();
wifiAP = createAPConfiguration(wifiAP.SSID.replace("\"", ""), pass.trim(), getSecurityType(wifiAP));
int res = wifi.addNetwork(wifiAP);
if (res == -1) {
for (WifiConfiguration cc : wifiManager.getConfiguredNetworks()) {
if (cc.SSID.equals(wifiAP.SSID))
res = cc.networkId;
}
}
boolean b = wifi.enableNetwork(res, true);
Log.d(TAG, "# enableNetwork returned " + b);
wifi.reconnect();
wifi.saveConfiguration();
}
private WifiConfiguration createAPConfiguration(String networkSSID, String networkPasskey, String securityMode) {
WifiConfiguration wifiConfiguration = new WifiConfiguration();
wifiConfiguration.SSID = "\"" + networkSSID + "\"";
wifiConfiguration.priority = getMaxPriority(context) + 1;
if (securityMode.equalsIgnoreCase("OPEN")) {
wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
} else if (securityMode.equalsIgnoreCase("WEP")) {
wifiConfiguration.wepKeys[0] = "\"" + networkPasskey + "\"";
wifiConfiguration.wepTxKeyIndex = 0;
wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
} else if (securityMode.equalsIgnoreCase("PSK")) {
wifiConfiguration.preSharedKey = "\"" + networkPasskey + "\"";
wifiConfiguration.hiddenSSID = true;
wifiConfiguration.status = WifiConfiguration.Status.ENABLED;
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
} else {
Log.i("wifi", "# Unsupported security mode: " + securityMode);
return null;
}
return wifiConfiguration;
}
有人遇到过类似的问题吗?
解决方案
推荐阅读
- vue.js - Framework7循环路由内的动态内容
- java - 在 JFileChooser 上显示文件名 ToolTipText
- c# - 不一致的可访问性:替代拥有私有嵌套类的公共实例
- python - 在 Ubuntu 而不是 Mac 上连接列表时出现 MemoryError
- ios - 如何在 stackView 中重叠子视图?
- string - Kotlin 并使用 padEnd() 两次
- spring-boot - Spring Boot 2中域类的单元测试
- qt - 调用更新后保存 QPainter
- plotly - 在编辑器中绘图
- java - Android 6.0 模拟器进程不起作用