以编程方式连接到Wifi不适用于Android Marshmallow?

时间:2016-07-13 08:54:42

标签: android android-wifi android-6.0-marshmallow

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 Lollipop上工作正常,但我想以编程方式为Marshmallow设置配置。我已经给出了所有运行时权限和危险权限,但仍然没有帮助,也无法删除已保存的WiFi密码。如果有人为Marshmallow做过这件事,那将会很有帮助。

4 个答案:

答案 0 :(得分:2)

嗯......我们在Marshmallow连接到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" />

答案 1 :(得分:0)

从Android 6开始,您无法修改未创建的wifi配置。如果我记得,Android 6.0+也不再需要围绕SSID名称的引号。

这是我的流程 - 与你的略有不同:     addNetwork()     saveConfiguration()     enableNetwork()

答案 2 :(得分:0)

我在Android 6-Marshmallow中遇到过这种类型的错误。在搜索和编码很多之后,我设法通过添加如下的额外权限来解决问题:

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

希望这对新来者有所帮助。

答案 3 :(得分: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;
}