android6.0 切换到指定wifi

Posted 彼岸花you

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android6.0 切换到指定wifi相关的知识,希望对你有一定的参考价值。

遇到的问题:
1、在网上找到一个wifi工具类,写了初步的切换到指定wifi的demo,测试后,一切ok。换到指定设备的wifi,失败了,点击连接,app无响应了。
2、wifi切换太慢了,同事觉得不稳定,继续改。根据设备的wifi加密模式,修改了创建wifi的方式,测试之后基本上都能连上,偶尔不能切换成功
3、最近一个偶然的机会又来测试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

以上是关于android6.0 切换到指定wifi的主要内容,如果未能解决你的问题,请参考以下文章

BCM43438 android6.0移植

BCM43438 android6.0移植

Android6.0权限系统

Android6.0 WMS WMS动画管理

解决Android 6.0获取wifi Mac地址为02:00:00:00:00:00问题

android6.0源码分析之AMS服务源码分析