【问题标题】:What is the Android equivalent of the CaptiveNetwork API (iOS)?CaptiveNetwork API (iOS) 的 Android 等效项是什么?
【发布时间】:2015-11-22 19:21:20
【问题描述】:

我希望注册用户连接到 WiFi 网络并无缝进行身份验证。这应该在用户运行应用程序并检测到特定 SSID 时发生。

CaptiveNetwork 编程接口允许应用程序与 Captive Network Support 进行交互,该系统组件负责检测在提供 Internet 访问之前需要用户交互的网络。这些网络通常是机场和酒店等公共场所的 WiFi 热点。

见:https://developer.apple.com/library/ios/documentation/SystemConfiguration/Reference/CaptiveNetworkRef/index.html

【问题讨论】:

  • 由于该 API 没有直接的类似物,您可能希望准确说明您希望使用该 API 完成什么,以便我们提出解决方法。
  • 谢谢,我已经相应地更新了问题。

标签: android ios captivenetwork


【解决方案1】:

首先你必须检查你的网络是否可用

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 上添加权限

P.S:三星设备在 4.4 及早期版本的 SSID 扫描存在一些问题,请小心。 P.P.S:对于身份验证,在我打开的情况下,您必须使用特定的 AP 连接配置。 问候

【讨论】:

    猜你喜欢
    • 2012-05-05
    • 1970-01-01
    • 2016-02-02
    • 2018-02-22
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多