Android通过名称以编程方式连接到Open WiFi – 这是最佳解决方案?

我一直试图使用两种方法按名称以编程方式连接到开放的wifi(连接门户)。

我使用op1,但它只能使用80%的次数。

_____________________________________________________

op1:

public static void connectToWifi(Context context, String networkSSID) { WifiConfiguration conf = new WifiConfiguration(); conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); wifiManager.addNetwork(conf); List list = wifiManager.getConfiguredNetworks(); for (WifiConfiguration i : list) { Log.d(TAG + " |connectToWifi()", "i.SSID=> " + i.SSID); if (i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) { wifiManager.disconnect(); wifiManager.enableNetwork(i.networkId, true); wifiManager.reconnect(); Log.d(TAG + " |connectToWifi()", "IF > i.SSID=> " + i.SSID); break; }else {Log.e(TAG + " |connectToWifi()", "ELSE - FAILED TO CONNECT > i.SSID=> " + i.SSID);} } }//end connectToWifi 

op2:来自https://stackoverflow.com/a/8818490/3792198

 conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); wifiManager.addNetwork(conf); List list = wifiManager.getConfiguredNetworks(); for( WifiConfiguration i : list ) { if(i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) { wifiManager.disconnect(); wifiManager.enableNetwork(i.networkId, true); wifiManager.reconnect(); break; } } 

OP3:

 WifiConfiguration wifiConfig = new WifiConfiguration(); wifiConfig.SSID = String.format("\"%s\"", ssid); wifiConfig.preSharedKey = String.format("\"%s\"", key); WifiManager wifiManager = (WifiManager)getSystemService(WIFI_SERVICE); //remember id int netId = wifiManager.addNetwork(wifiConfig); wifiManager.disconnect(); wifiManager.enableNetwork(netId, true); wifiManager.reconnect(); 

或者,你有什么建议吗? 谢谢

 import android.app.Activity; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.text.TextUtils; import android.util.Log; import java.util.List; /** * ConnectionManager */ public class ConnectionManager { private Context context; private Activity activity; private static final String WPA = "WPA"; private static final String WEP = "WEP"; private static final String OPEN = "Open"; private final static String TAG = "WiFiConnector"; public ConnectionManager(Context context) { this.context = context; this.activity = (Activity) context; } public void enableWifi() { WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); if (!wifiManager.isWifiEnabled()) { wifiManager.setWifiEnabled(true); new ShowToast(context, "Wifi Turned On"); } } public int requestWIFIConnection(String networkSSID, String networkPass) { try { WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); //Check ssid exists if (scanWifi(wifiManager, networkSSID)) { if (getCurrentSSID(wifiManager) != null && getCurrentSSID(wifiManager).equals("\"" + networkSSID + "\"")) { new ShowToast(context, "Already Connected With " + networkSSID); return Constants.ALREADY_CONNECTED; } //Security type detection String SECURE_TYPE = checkSecurity(wifiManager, networkSSID); if (SECURE_TYPE == null) { new ShowToast(context, "Unable to find Security type for " + networkSSID); return Constants.UNABLE_TO_FIND_SECURITY_TYPE; } if (SECURE_TYPE.equals(WPA)) { WPA(networkSSID, networkPass, wifiManager); } else if (SECURE_TYPE.equals(WEP)) { WEP(networkSSID, networkPass); } else { OPEN(wifiManager, networkSSID); } return Constants.CONNECTION_REQUESTED; } /*connectME();*/ } catch (Exception e) { new ShowToast(context, "Error Connecting WIFI " + e); } return Constants.SSID_NOT_FOUND; } private void WPA(String networkSSID, String networkPass, WifiManager wifiManager) { WifiConfiguration wc = new WifiConfiguration(); wc.SSID = "\"" + networkSSID + "\""; wc.preSharedKey = "\"" + networkPass + "\""; wc.status = WifiConfiguration.Status.ENABLED; wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); int id = wifiManager.addNetwork(wc); wifiManager.disconnect(); wifiManager.enableNetwork(id, true); wifiManager.reconnect(); } private void WEP(String networkSSID, String networkPass) { } private void OPEN(WifiManager wifiManager, String networkSSID) { WifiConfiguration wc = new WifiConfiguration(); wc.SSID = "\"" + networkSSID + "\""; wc.hiddenSSID = true; wc.priority = 0xBADBAD; wc.status = WifiConfiguration.Status.ENABLED; wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); int id = wifiManager.addNetwork(wc); wifiManager.disconnect(); wifiManager.enableNetwork(id, true); wifiManager.reconnect(); } boolean scanWifi(WifiManager wifiManager, String networkSSID) { Log.e(TAG, "scanWifi starts"); List scanList = wifiManager.getScanResults(); for (ScanResult i : scanList) { if (i.SSID != null) { Log.e(TAG, "SSID: " + i.SSID); } if (i.SSID != null && i.SSID.equals(networkSSID)) { Log.e(TAG, "Found SSID: " + i.SSID); return true; } } new ShowToast(context, "SSID " + networkSSID + " Not Found"); return false; } public String getCurrentSSID(WifiManager wifiManager) { String ssid = null; ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (networkInfo.isConnected()) { final WifiInfo connectionInfo = wifiManager.getConnectionInfo(); if (connectionInfo != null && !TextUtils.isEmpty(connectionInfo.getSSID())) { ssid = connectionInfo.getSSID(); } } return ssid; } private String checkSecurity(WifiManager wifiManager, String ssid) { List networkList = wifiManager.getScanResults(); for (ScanResult network : networkList) { if (network.SSID.equals(ssid)) { String Capabilities = network.capabilities; if (Capabilities.contains("WPA")) { return WPA; } else if (Capabilities.contains("WEP")) { return WEP; } else { return OPEN; } } } return null; } } 

调用方法

 ConnectionManager connectionManager=new ConnectionManager(context); connectionManager.enableWifi(); connectionManager.requestWIFIConnection("YOUR_SSID","PASSWORD");