2016-07-13 105 views
1
String BACKSLASH = "\""; 
String NETWROK_SECURITY_WEP = "WEP"; 
String NETWROK_SECURITY_NONE = "NONE"; 
String NETWROK_SECURITY_WPA = "WPA"; 
String NETWROK_SECURITY_WPA2 = "WPA2"; 
String NETWROK_SECURITY_WPA_WPA2 = "WPA/WPA2 PSK"; 
String NETWROK_ADDITIONAL_SECURITY_TKIP = "TKIP"; 
String NETWROK_ADDITIONAL_SECURITY_AES = "AES"; 
String NETWROK_ADDITIONAL_SECURITY_WEP = "WEP"; 
String NETWROK_ADDITIONAL_SECURITY_NONE = "NONE"; 
int FAILED_TO_ADD_NETWORK = -1; 

WifiConfiguration conf = new WifiConfiguration(); 
String wifiName = sSid; 
conf.SSID = BACKSLASH + wifiName + BACKSLASH; 
String securityType = NETWROK_SECURITY_WPA_WPA2; 

if (NETWROK_SECURITY_WEP.equalsIgnoreCase(securityType)) { 
    conf.wepKeys[0] = pass; 
    conf.wepTxKeyIndex = 0; 
    conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 
} else if (NETWROK_SECURITY_NONE.equalsIgnoreCase(securityType)) { 
    conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
} else if (NETWROK_SECURITY_WPA.equalsIgnoreCase(securityType) 
     || NETWROK_SECURITY_WPA2.equalsIgnoreCase(securityType) 
     || NETWROK_SECURITY_WPA_WPA2.equalsIgnoreCase(securityType)) { 
    conf.preSharedKey = BACKSLASH + pass + BACKSLASH; 
    conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
    conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
    conf.status = WifiConfiguration.Status.ENABLED; 
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
    conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
    conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 
    conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
    conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
    conf.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 
} 
String wlanAdditionalSecurity = ""; 
if (NETWROK_ADDITIONAL_SECURITY_TKIP.equalsIgnoreCase(wlanAdditionalSecurity)) { 
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
    conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 
} else if (NETWROK_ADDITIONAL_SECURITY_AES.equalsIgnoreCase(wlanAdditionalSecurity)) { 
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
    conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
} else if (NETWROK_ADDITIONAL_SECURITY_WEP.equalsIgnoreCase(wlanAdditionalSecurity)) { 
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); 
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 
} else if (NETWROK_ADDITIONAL_SECURITY_NONE.equalsIgnoreCase(wlanAdditionalSecurity)) { 
    conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.NONE); 
} 
WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); 
int res = wifiManager.addNetwork(conf); 
wifiManager.disconnect(); 
wifiManager.reconnect(); 

if (true) { 

    wifiManager.enableNetwork(res, true); 

    wifiManager.saveConfiguration(); 
    wifiManager.setWifiEnabled(true); 

    new AppPreferences(mContext).setPrefrenceLong("connectTime", Calendar.getInstance().getTimeInMillis()); 
} 
if (res != -1) { 

    setFalseOther(mm); 
    notifyDataSetChanged(); 

    Intent i = new Intent(mContext, Connect.class); 
    i.putExtra("networkName", mm.getName()); 
    i.putExtra("networkId", mm.getId()); 
    i.putExtra("AdminID", mm.getUserId()); 
    i.putExtra("networkConnection", "true"); 

    mContext.startActivity(i); 

} else { 

} 

此代碼用於連接到WiFi。它在Android棒棒糖上工作正常,但我想以編程方式爲棉花糖設置配置。我給了所有的運行時間權限和危險的權限,但仍然沒有幫助,無法刪除保存的WiFi密碼。如果有人爲棉花糖做了這個,這將是有幫助的。通過編程方式連接到Wifi不適用於Android Marshmallowow?

回答

0

從Android 6開始,您無法修改您未創建的WiFi配置。如果我記得,Android 6.0+不再需要引用SSID名稱。

這裏是我的流程 - 從你的略有不同: addNetwork() saveConfiguration() enableNetwork()

+0

韋恩感謝您的答覆。其實我的代碼是不能工作在棉花糖。每當我試圖通過給SSID,它仍然有連接到前一個密碼才能連接到其他網絡添加權限。您可以在這裏分享您的POC,這將有所幫助。 –

+0

也無論何時我試圖連接到其他網絡我的應用程序卡住了,我得到了這個問題「無法chmod(/ sdcard/appName):android.system.ErrnoException:chmod失敗:EPERM(操作不允許)」.. –

0

我已經在Android的6棉花糖遇到這種類型的錯誤。搜索和編碼了很多後我設法通過加入像下面的一個額外的許可來解決這個問題:

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>

希望這有助於爲新來者。

0

嗯,我想我已經找到了這個...測試,做工精細的解決方案..

public boolean connectToWifi(String knownSSID,String key) { 

    try{ 
     //If Wifi is not enabled, enable it 
     if (!mWifiManager.isWifiEnabled()) { 
      Log.v(LOG_TAG, "Wifi is not enabled, enable it"); 
      mWifiManager.setWifiEnabled(true); 
     } 
     WifiConfiguration config = new WifiConfiguration(); 
     config.SSID = convertToQuotedString(knownSSID); 
     // if key is empty means it is open network-- I am considering like this 
     if(key.isEmpty()){ 
      config.allowedKeyManagement.set(KeyMgmt.NONE); 
     } else { 
      config.preSharedKey = convertToQuotedString(key); 
     } 

     int networkId = mWifiManager.addNetwork(config); 
     // it will return -1 if the config is already saved.. 
     if(networkId == -1){ 
      networkId = getExistingNetworkId(config.SSID); 
     } 
     boolean es = mWifiManager.saveConfiguration(); 

     mWifiManager.disconnect(); 
     // giving time to disconnect here. 
     Thread.sleep(3*1000); 
     boolean bRet = mWifiManager.enableNetwork(networkId, true); 
     mWifiManager.reconnect(); 

    } catch(InterruptedException e) { 

    } 

}

public int getExistingNetworkId(String SSID){ 
    List<WifiConfiguration> configuredNetworks = mWifiManager.getConfiguredNetworks(); 
    if (configuredNetworks != null) { 
     for (WifiConfiguration existingConfig : configuredNetworks) { 
      if (SSID.equalsIgnoreCase(existingConfig.SSID)) { 
       return existingConfig.networkId; 
      } 
     } 
    } 
    return -1; 
} 
1

嗯......我們在代碼的微小變化連接到棉花糖WiFi網絡.. 我認爲下面的代碼將作品你...

public void connectToWifi(){ 
    try{ 
     WifiManager wifiManager = (WifiManager) super.getSystemService(android.content.Context.WIFI_SERVICE); 
     WifiConfiguration wc = new WifiConfiguration(); 
     WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
     wc.SSID = "\"NETWORK_NAME\""; 
     wc.preSharedKey = "\"PASSWORD\""; 
     wc.status = WifiConfiguration.Status.ENABLED; 
     wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 
     wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
     int netId = wifiManager.addNetwork(wc); 
     if (netId == -1) { 
      netId = getExistingNetworkId(wc.SSID); 
     } 
     wifiManager.disconnect(); 
     wifiManager.enableNetwork(netId, true); 
     wifiManager.reconnect(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
private int getExistingNetworkId(String SSID) { 
    WifiManager wifiManager = (WifiManager) super.getSystemService(Context.WIFI_SERVICE); 
    List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks(); 
    if (configuredNetworks != null) { 
     for (WifiConfiguration existingConfig : configuredNetworks) { 
      if (existingConfig.SSID.equals(SSID)) { 
       return existingConfig.networkId; 
      } 
     } 
    } 
    return -1; 
} 

而在清單文件

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />