android6.0 切换到指定wifi

遇到的问题:
1、在网上找到一个wifi工具类,写了初步的切换到指定wifi的demo,测试后,一切ok。换到指定设备的wifi,失败了,点击连接,app无响应了。
2、wifi切换太慢了,同事觉得不稳定,继续改。根据设备的wifi加密模式,修改了创建wifi的方式,测试之后基本上都能连上,偶尔不能切换成功
3、最近一个偶然的机会又来测试wifi。额…..失败了,并且一直切换不过去,简直不是一般的难受。
官方文档才是正理 android6.0 切换到指定wifi
文章图片

【android6.0 切换到指定wifi】上述切换失败的原因
android6.0 只允许操作自己创建的WifiConfiguration。
上面遇到的问题在于自己对“个人创建创建WifiConfiguration” 理解不到位。以及对wifi加密模式的不清楚,我们的设备是wpa2的加密模式,直接使用了wpa2的加密模式,切换速度比以前更快了,而且成功率也高了很多。
wifi的种类
wifi有两种,一种是自己在代码里面创建,一种是别人的.
别人的wifi:主要包括由用户手动输入密码连接的wifi和其他app创建的wifi—这里简称为系统wifi
自己的wifi:自己在app里面创建的wifi—-这里简称为个人wifi
连接成功了 则表示创建wifi成功了。
对wifi的操作
系统wifi:虽然可以通过wifiManager的savedConfiguration方法获取到指定wifi对应的Configuration,但是并不能进行具体的操作,add该wifi,会直接返回-1(addNetwork(WifiConfigurationconfig)=-1),enableNetwork(config)时会导致app无响应,removeNetwork(config)=false,移除系统wifi也不会成功。详见下列的测试过程。
个人wifi:可以进行add、enable、remove操作,详见下列的测试过程 。
测试过程
WifiConfiguration wifiNewConfiguration = createWifiInfo(aimWifiName, aimWifiPwd); //使用wpa2的wifi加密方式 int newNetworkId = wifiManager.addNetwork(wifiNewConfiguration); Log.e("MainActivity", "newNetworkId:" + newNetworkId); /** * addNetwork打印结果: * 1、未保存密码==32 * 2、在代码里面保存了密码==32--意思是在代码里面add了 没有remove的情况 * 3、手动连接了密码==-1 */ boolean enableNetwork = wifiManager.enableNetwork(newNetworkId, true); //newNetworId在操作系统wifi的时候,可以换成通过saveConfiguration中WifiConfiguration 获取到networkId来继续进行测试,这里就忽略啦 Log.e("MainActivity", "enableNetwork:" + enableNetwork); /** * enableNetwork打印结果: * 1、未保存密码切换成功 * 2、在代码里面保存了密码切换成功 * 3、手动连接了密码app无响应了 */

解决方案 android6.0 运行时环境在demo里面。
//最终解决方案 WifiConfiguration wifiNewConfiguration = createWifiInfo(aimWifiName, aimWifiPwd); //使用wpa2的wifi加密方式 int newNetworkId = mWifiManager.addNetwork(wifiNewConfiguration); if (newNetworkId == -1) { Log.e("MainActivity", "操作失败,需要您到手机wifi列表中取消对设备连接的保存"); } else { boolean enableNetwork = mWifiManager.enableNetwork(newNetworkId, true); if (!enableNetwork) { Log.e("MainActivity", "切换到指定wifi失败"); } else { Log.e("MainActivity", "切换到指定wifi成功"); } }

demo地址 https://github.com/WhatWeCan/WifiDemo

    推荐阅读