我希望注册用户连接到 WiFi 网络并无缝进行身份验证。这应该在用户运行应用程序并检测到特定 SSID 时发生。
CaptiveNetwork 编程接口允许应用程序与 Captive Network Support 进行交互,该系统组件负责检测在提供 Internet 访问之前需要用户交互的网络。这些网络通常是机场和酒店等公共场所的 WiFi 热点。
我希望注册用户连接到 WiFi 网络并无缝进行身份验证。这应该在用户运行应用程序并检测到特定 SSID 时发生。
CaptiveNetwork 编程接口允许应用程序与 Captive Network Support 进行交互,该系统组件负责检测在提供 Internet 访问之前需要用户交互的网络。这些网络通常是机场和酒店等公共场所的 WiFi 热点。
首先,您必须检查您的网络是否可用
wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
}
wifiResultsReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
context.unregisterReceiver(wifiResultsReceiver);
List<ScanResult> wifiList;
wifiList = wifiManager.getScanResults();
for (int i = 0; i < wifiList.size(); i++) {
String[] networkInfo = wifiList.get(i).toString().split(",");
if (networkInfo[0].trim().equals(YOUR_SSID)) {
//Check if your ssid is available &
connect();
}
}
};
context.registerReceiver(wifiResultsReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
wifiManager.startScan();
然后,如果网络可用,您可以连接到您的 SSID(这是我的配置之一):
public static WifiConfiguration getConnectionConfig(Context context, String ssidName) {
Validator.validateArgument(context, "Context can't be null");
WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
if (!wifiManager.isWifiEnabled()) wifiManager.setWifiEnabled(true);
WifiConfiguration wifiConfig = new WifiConfiguration();
wifiConfig.SSID = ssidName;
List<WifiConfiguration> curentList = wifiManager.getConfiguredNetworks();
if (curentList != null && !curentList.isEmpty()) {
curentList.removeAll(Collections.singleton(null));
for (int i = 0; i < curentList.size(); i++) {
WifiConfiguration item = curentList.get(i);
if (ssidName.equals(item.SSID)) {
wifiManager.removeNetwork(item.networkId);
}
}
}
wifiConfig.status = WifiConfiguration.Status.DISABLED;
wifiConfig.priority = 100;
wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wifiConfig.allowedAuthAlgorithms.clear();
wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
return wifiConfig;
}
private void connect() {
wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
int networkID = wifiManager.addNetwork(getConnectionConfig(context, YOUR_SSID));
wifiManager.disconnect();
wifiManager.enableNetwork(networkID, true);
wifiManager.reconnect();
}
不要忘记在 AndroidManifest 上添加权限
PS:三星设备在 4.4 及早期版本的 SSID 扫描存在一些问题,请小心。PPS:对于身份验证,在我打开的情况下,您必须为 AP 连接使用特定配置。问候