2011-06-29 91 views

回答

30

將SSID及其密碼傳遞給以下方法。

public void connectToAP(String ssid, String passkey) { 
    Log.i(TAG, "* connectToAP"); 

    WifiConfiguration wifiConfiguration = new WifiConfiguration(); 

    String networkSSID = ssid; 
    String networkPass = passkey; 

    Log.d(TAG, "# password " + networkPass); 

    for (ScanResult result : scanResultList) { 
     if (result.SSID.equals(networkSSID)) { 

      String securityMode = getScanResultSecurity(result); 

      if (securityMode.equalsIgnoreCase("OPEN")) { 

       wifiConfiguration.SSID = "\"" + networkSSID + "\""; 
       wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
       int res = wifiManager.addNetwork(wifiConfiguration); 
       Log.d(TAG, "# add Network returned " + res); 

       boolean b = wifiManager.enableNetwork(res, true); 
       Log.d(TAG, "# enableNetwork returned " + b); 

       wifiManager.setWifiEnabled(true); 

      } else if (securityMode.equalsIgnoreCase("WEP")) { 

       wifiConfiguration.SSID = "\"" + networkSSID + "\""; 
       wifiConfiguration.wepKeys[0] = "\"" + networkPass + "\""; 
       wifiConfiguration.wepTxKeyIndex = 0; 
       wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
       wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 
       int res = wifiManager.addNetwork(wifiConfiguration); 
       Log.d(TAG, "### 1 ### add Network returned " + res); 

       boolean b = wifiManager.enableNetwork(res, true); 
       Log.d(TAG, "# enableNetwork returned " + b); 

       wifiManager.setWifiEnabled(true); 
      } 

      wifiConfiguration.SSID = "\"" + networkSSID + "\""; 
      wifiConfiguration.preSharedKey = "\"" + networkPass + "\""; 
      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); 

      int res = wifiManager.addNetwork(wifiConfiguration); 
      Log.d(TAG, "### 2 ### add Network returned " + res); 

      wifiManager.enableNetwork(res, true); 

      boolean changeHappen = wifiManager.saveConfiguration(); 

      if(res != -1 && changeHappen){ 
       Log.d(TAG, "### Change happen"); 

       AppStaticVar.connectedSsidName = networkSSID; 

      }else{ 
       Log.d(TAG, "*** Change NOT happen"); 
      } 

      wifiManager.setWifiEnabled(true); 
     } 
    } 
} 

public String getScanResultSecurity(ScanResult scanResult) { 
    Log.i(TAG, "* getScanResultSecurity"); 

    final String cap = scanResult.capabilities; 
    final String[] securityModes = { "WEP", "PSK", "EAP" }; 

    for (int i = securityModes.length - 1; i >= 0; i--) { 
     if (cap.contains(securityModes[i])) { 
      return securityModes[i]; 
     } 
    } 

    return "OPEN"; 
} 

不要忘記在Manifest文件中添加必要的權限。

+3

此代碼不能編譯, WH ere定義了變量scanResultList和wifiManager? – yoprogramo

+0

您需要獲取WifiManager wifiManager(Context.getSystemService(Context.WIFI_SERVICE))並對其進行調用(wifiMananger.getScanResults())以獲取scanResultList變量。上面的代碼假定您已經有可用網絡的列表。 – wblaschko

+2

代碼中的AppStaticVar是什麼? –

2

這裏發佈的代碼AnujAroshA真的很有幫助。但是還有一個缺失的情況:

.. 
    } else if (securityMode.equalsIgnoreCase("PSK")) { 
    // PSK code 
    .. 

否則PSK碼也會針對WEP和OPEN網絡執行。

在我看來,代碼風格並不是最優的。沒有必要創建兩個Strings networkSSID和networkPass。您可以簡單地使用ssid或密碼。

建議:拆分創建wifi配置和連接方法。

(1)用於創建WifiConfiguration方法:

private WifiConfiguration createAPConfiguration(String networkSSID, String networkPasskey, String securityMode) { 
     WifiConfiguration wifiConfiguration = new WifiConfiguration(); 

     wifiConfiguration.SSID = "\"" + networkSSID + "\""; 

     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(TAG, "# Unsupported security mode: "+securityMode); 

      return null; 
     } 

     return wifiConfiguration; 

    } 

(2)用於AP方法連接:

public int connectToAP(String networkSSID, String networkPasskey) { 
    for (ScanResult result : scanResultList) { 

     if (result.SSID.equals(networkSSID)) { 

      String securityMode = getScanResultSecurity(result); 

      WifiConfiguration wifiConfiguration = createAPConfiguration(networkSSID, networkPasskey, securityMode); 

      int res = wifiManager.addNetwork(wifiConfiguration); 
      Log.d(TAG, "# addNetwork returned " + res); 

      boolean b = wifiManager.enableNetwork(res, true); 
      Log.d(TAG, "# enableNetwork returned " + b); 

      wifiManager.setWifiEnabled(true); 

      boolean changeHappen = wifiManager.saveConfiguration(); 

      if (res != -1 && changeHappen) { 
       Log.d(TAG, "# Change happen"); 
       connectedSsidName = networkSSID; 
      } else { 
       Log.d(TAG, "# Change NOT happen"); 
      } 

      return res; 
     } 
    } 

    return -1; 
} 

(3)掃描方法100%張貼AnujAroshA

public String getScanResultSecurity(ScanResult scanResult) { 

    final String cap = scanResult.capabilities; 
    final String[] securityModes = { "WEP", "PSK", "EAP" }; 

    for (int i = securityModes.length - 1; i >= 0; i--) { 
     if (cap.contains(securityModes[i])) { 
      return securityModes[i]; 
     } 
    } 

    return "OPEN"; 
} 
4

100%Works。

通過這種方式,您可以連接到特定的Wif 此代碼爲MainActivity.java

////////////// >>> WIFI連接(WP2)< < < ////////////////

 WifiConfiguration wifiConfig = new WifiConfiguration(); 

     wifiConfig.SSID = String.format("\"%s\"", "Wifi name"); 
     wifiConfig.preSharedKey = String.format("\"%s\"", "Wifi password"); 

     WifiManager wifiManager=(WifiManager)getSystemService(WIFI_SERVICE); 
     int netId = wifiManager.addNetwork(wifiConfig); 
     wifiManager.disconnect(); 
     wifiManager.enableNetwork(netId, true); 
     wifiManager.reconnect(); 

,也不要忘了,包括這個代碼添加到您的AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
相關問題