2011-06-29 24 views

Trả lời

30

Vượt qua SSID và mật khẩu của nó theo phương pháp sau.

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"; 
} 

Đừng quên thêm quyền cần thiết vào tệp kê khai.

+3

mã này không biên dịch, wh ere được định nghĩa các biến scanResultList và wifiManager? – yoprogramo

+0

Bạn sẽ cần phải có wifiManager wifiManager (Context.getSystemService (Context.WIFI_SERVICE)) và thực hiện cuộc gọi trên đó (wifiMananger.getScanResults()) để nhận biến scanResultList. Mã trên giả định bạn đã có danh sách các mạng khả dụng. – wblaschko

+2

AppStaticVar trong mã của bạn là gì? –

2

Mã được đăng từ AnujAroshA ở đây thực sự hữu ích. Nhưng có một trường hợp khác bị thiếu:

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

Nếu không, mã PSK cũng được thực hiện cho mạng WEP và OPEN.

Và kiểu mã không tối ưu theo ý kiến ​​của tôi. Không cần thiết phải tạo ra hai chuỗi NetworkSSID và networkPass. Bạn chỉ có thể sử dụng ssid hoặc passkey.

Đề xuất: Tách cách tạo cấu hình wifi và phương thức kết nối.

(1) Phương pháp để tạo 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) Phương pháp cho AP kết nối:

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) Việc quét phương pháp 100% như được đăng 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% hoạt động.

Bằng cách này bạn có thể kết nối với wif cụ thể của bạn Mã này cho MainActivity.java

////////////// >>> kết nối 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(); 

Và cũng đừng quên để bao gồm mã này vào AndroidManifest.xml của bạn

<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" />