2011-06-29 92 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" /> 
相关问题