很久没有写博客了,今天记录下做项目中发现的问题,关于自动连接WiFi问题,本来在网上找了许多,发现测试下来不太好用,于是找了找原因,再次记录一下。

先说工具类吧,包含了许多,网上也能找到类似的

public class WifiAdmin {// 定义WifiManager对象private WifiManager mWifiManager;// 定义WifiInfo对象private WifiInfo mWifiInfo;// 扫描出的网络连接列表private List<ScanResult> mWifiList;// 网络连接列表private List<WifiConfiguration> mWifiConfiguration;// 定义一个WifiLockWifiManager.WifiLock mWifiLock;public WifiManager getmWifiManager() {return mWifiManager;}public void setmWifiManager(WifiManager mWifiManager) {this.mWifiManager = mWifiManager;}// 构造器public WifiAdmin(Context context) {// 取得WifiManager对象mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);// 取得WifiInfo对象mWifiInfo = mWifiManager.getConnectionInfo();}// 打开WIFIpublic void openWifi() {if (!mWifiManager.isWifiEnabled()) {mWifiManager.setWifiEnabled(true);}}// 关闭WIFIpublic void closeWifi() {if (mWifiManager.isWifiEnabled()) {mWifiManager.setWifiEnabled(false);}}// 检查当前WIFI状态public int checkState() {return mWifiManager.getWifiState();}// 锁定WifiLockpublic void acquireWifiLock() {mWifiLock.acquire();}// 解锁WifiLockpublic void releaseWifiLock() {// 判断时候锁定if (mWifiLock.isHeld()) {mWifiLock.acquire();}}// 创建一个WifiLockpublic void creatWifiLock() {mWifiLock = mWifiManager.createWifiLock("Test");}// 得到配置好的网络public List getConfiguration() {return mWifiConfiguration;}// 指定配置好的网络进行连接public void connectConfiguration(int index) {// 索引大于配置好的网络索引返回if (index > mWifiConfiguration.size()) {return;}// 连接配置好的指定ID的网络mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,true);}public void startScan() {mWifiManager.startScan();// 得到扫描结果mWifiList = mWifiManager.getScanResults();// 得到配置好的网络连接mWifiConfiguration = mWifiManager.getConfiguredNetworks();}// 得到网络列表public List getWifiList() {return mWifiManager.getScanResults();}// 查看扫描结果public StringBuilder lookUpScan() {StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < mWifiList.size(); i++) {stringBuilder.append("Index_" + new Integer(i + 1).toString() + ":");// 将ScanResult信息转换成一个字符串包// 其中把包括:BSSID、SSID、capabilities、frequency、levelstringBuilder.append((mWifiList.get(i)).toString());stringBuilder.append("/n");}return stringBuilder;}// 得到MAC地址public String getMacAddress() {return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();}// 得到接入点的BSSIDpublic String getBSSID() {return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();}// 得到IP地址public int getIPAddress() {return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();}// 得到连接的IDpublic int getNetworkId() {return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();}// 得到WifiInfo的所有信息包public String getWifiInfo() {return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString();}// 添加一个网络并连接public  void addNetwork(WifiConfiguration wcg) {int wcgID = mWifiManager.addNetwork(wcg);mWifiManager.disconnect();boolean b = mWifiManager.enableNetwork(wcgID, true);mWifiManager.saveConfiguration();mWifiManager.reconnect();System.out.println("b--" + b);}// 断开指定ID的网络public void disconnectWifi(int netId) {mWifiManager.disableNetwork(netId);mWifiManager.disconnect();}//然后是一个实际应用方法,只验证过没有密码的情况:public WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type) {WifiConfiguration config = new WifiConfiguration();config.allowedAuthAlgorithms.clear();config.allowedGroupCiphers.clear();config.allowedKeyManagement.clear();config.allowedPairwiseCiphers.clear();config.allowedProtocols.clear();//        config.SSID = "\"" + SSID + "\"";config.SSID = "\"" + getTrueSSID(SSID) + "\"";
移除掉之前的wifiWifiConfiguration tempConfig = this.IsExsits(SSID);if (tempConfig != null) {mWifiManager.removeNetwork(tempConfig.networkId);}if (Type == 1)// WIFICIPHER_NOPASS{//            config.wepKeys[0] = "";config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);//            config.wepTxKeyIndex = 0;}if (Type == 2) //WIFICIPHER_WEP{config.hiddenSSID = true;config.wepKeys[0] = "\"" + Password + "\"";config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);config.wepTxKeyIndex = 0;}if (Type == 3) // WIFICIPHER_WPA{config.preSharedKey = "\"" + Password + "\"";config.hiddenSSID = true;config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);//            config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
这里需要注意下有的文章是注释掉的这一句话,这是不可以的,找了半天才发现原因config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);config.status = WifiConfiguration.Status.ENABLED;}return config;}public int getCipherType(String ssid) {List<ScanResult> list = mWifiManager.getScanResults();for (ScanResult scResult : list) {if (!TextUtils.isEmpty(scResult.SSID)&& (scResult.SSID.trim().equalsIgnoreCase("\"" + ssid + "\"") || scResult.SSID.trim().equalsIgnoreCase(ssid))) {String capabilities = scResult.capabilities;LogUtil.i("hefeng", "capabilities=" + capabilities);if (!TextUtils.isEmpty(capabilities)) {if (capabilities.contains("WPA")|| capabilities.contains("wpa")) {return 3;} else if (capabilities.contains("WEP")|| capabilities.contains("wep")) {return 2;} else {return 1;}}}}return -1;}private WifiConfiguration IsExsits(String ssid) {List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks();for (WifiConfiguration existingConfig : existingConfigs) {// if (existingConfig.SSID.equals("\"" + SSID + "\"")) {if (existingConfig.SSID.equalsIgnoreCase("\"" + ssid + "\"")|| existingConfig.SSID.equalsIgnoreCase(ssid)) {return existingConfig;}}return null;}public boolean ifWifiExsits(String ssid) {mWifiList = getWifiList();if (mWifiList == null) {return false;}for (int i = 0; i < mWifiList.size(); i++) {if (mWifiList.get(i).SSID.equalsIgnoreCase("\"" + ssid + "\"")|| mWifiList.get(i).SSID.equalsIgnoreCase(ssid)) {return true;}}return false;}public String getTrueSSID(String ssid) {LogUtil.e("", ssid + "");mWifiList = getWifiList();if (mWifiList == null) {return ssid;}for (int i = 0; i < mWifiList.size(); i++) {if (mWifiList.get(i).SSID.equalsIgnoreCase("\"" + ssid + "\"")|| mWifiList.get(i).SSID.equalsIgnoreCase(ssid)) {return mWifiList.get(i).SSID;}}return ssid;}public boolean isConnect(String ssid) {WifiInfo wifiInfo = mWifiManager.getConnectionInfo();if (wifiInfo != null) {return wifiInfo.getSSID().equalsIgnoreCase("\"" + ssid + "\"")|| wifiInfo.getSSID().equalsIgnoreCase(ssid);}return false;}public WifiInfo getCurrentWifiInfo() {return mWifiManager.getConnectionInfo();}public boolean isWifiEnable() {return mWifiManager.isWifiEnabled();}
这个大部分和网上的还是一致的,这里记录下。

接下来是使用

  WifiAdmin wifiAdmin = new WifiAdmin(getActivity());if (!wifiAdmin.isWifiEnable()) {wifiAdmin.openWifi();}if (wifiAdmin.getmWifiManager().isWifiEnabled()) {if (!wifiAdmin.isConnect("wifi名称")) {if (wifiAdmin.ifWifiExsits("wifi名称")) {wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo("wifi名称", "wifi密码", wifiAdmin.getCipherType("wifi名称")));}}}

这里一定要加获取wifi和改变wifi的权限!!!!!!!!!

写到这里差不多就要结束了,本来开开心心的去试验,发现在6.0之前的版本是可以的,6.0之后的版本是不可以的,找了一下发现是6.0之后获取wifi的列表,需要获取地理位置,进而才能获取到周围的WiFi的列表.这里需要加申请地址位置权限,这里就不太多阐述了。

最后一定要加上获取地理位置权限

android 自动连接WiFi相关推荐

  1. Android自动连接指定的WiFi热点

    Android自动连接指定的WiFi热点 "Android自动连接指定的WiFi热点",看上去这是个再基础不过的功能了.很多人都觉得很简单,网上也有大量的资料.但在以Android ...

  2. Android 10自动连接WiFi问题 Android 10 断开WiFi问题

    说明:本文主要说明扫码之后自动连接WiFi的一些处理,扫码的流程相对简单,网上教程也比较多,对于目前Android各个版本也没有太多变化. 问题描述:最近在做项目的时候,发现以前的项目有扫描二维码自动 ...

  3. android 手动连接wifi,android手动连接wifi的过程

    android手动连接wifi的过程 下面就以手动连接mtk5931的wifi为列,来说明手动连接wifi的过程. 在此之前,先说明下,手动连接的使用场景和作用: a: 在纯linux的环境下,该手动 ...

  4. TQ2440 mifi驱动及开机自动连接wifi全过程

    想让你的 ARM 也能上网吗?那么请跟我来: 前期准备:买一个小米wifi(淘宝直接搜) 下载linux2.6.30:已共享到我的网盘: http://pan.baidu.com/s/1kUbhoGZ ...

  5. iOS App无需跳转系统设置自动连接Wi-Fi

    一: 介绍 近几年,智能设备越来越火,这些智能设备中,有很大一部分是通过手机来控制硬件设备,来达到预期的效果,这中间少不了要使用到蓝牙功能,通过蓝牙来通信来控制设备. 除了蓝牙控制设备之外,还可以通过 ...

  6. archlinux 开机自动连接wifi

    archlinux 开机自动连接wifi archlinux 开机后连接wifi很简单 利用wifi-menu命令就可以选择热点和输入密码 但是重启后又要再来一次. 如果安装了gui, 当然可以利用N ...

  7. android 获取连接WiFi的名称

    今天,简单讲讲如何获取连接的WiFi的名称. 首先AndroidMainfest.xml文件中添加权限: <uses-permission android:name="android. ...

  8. deepin开机未登录自动连接wifi

    deepin在开机后没有登录进系统前,不会自动连接wifi.这点对于远程不方便. 另外,如果是使用字符界面启动,也不会连接wifi. 方法很简单: nmcli device wifi connect ...

  9. html5 自动连接wifi,怎么设置自动切换wifi 点击右上角的【高级设置】

    怎么停止手机WIFI自动切换 安卓手机设置禁止自动连接WiFi的方法: 在此以"小米4"手机为例,打开手机"设置"界面,点击"WLAN"项进 ...

  10. android wifi连接流程,(九十三) Android O 连接WiFi AP流程梳理续——保存网络-Go语言中文社区...

    前言: 之前在(五十五)Android O 连接WiFi AP流程梳理 梳理连接流程梳理到SupplicantStaNetworkHal 然后没梳理的下去,现在继续梳理下. 之前梳理的时序图 1.流程 ...

最新文章

  1. 在绘制USB2.O设备接口差分线时,应注意以下几点要求:
  2. PHP CLI模式开发
  3. 一个使用numpy.ones()的矩阵| 使用Python的线性代数
  4. UNION、UNION ALL和EXISTS
  5. 给Editplus去掉.bak文件
  6. 图像识别中的边框回归笔记,终于搞明白了啊!
  7. 李占通他道出了我的心声
  8. 关于Tween的几个注意事项
  9. 中国大学MOOC中华茶礼仪真题及答案
  10. Python: PS 滤镜--马赛克
  11. 服务器配置信息怎么查看,查看服务器配置信息
  12. widows下如何修改Visual Studio2017的字体颜色
  13. Ajax提交与submit提交对比
  14. HTTP版本之间的区别
  15. iOS开发之加载、滑动翻阅大量图片优化解决方案
  16. 与黑客讨价还价,勒索攻击企业数据是关键
  17. 购入计算机设备一批验收入库,购入并已验收入库的原材料如何做会计分录
  18. python 语法基础篇
  19. (2) 机器视觉技术发展的五大趋势
  20. USB摄像头显示为VMare USB device

热门文章

  1. Windows获取本地安装软件详细信息(对标卸载程序控制面板)
  2. 成都一名程序员跳楼,程序员眼中的成都和天府软件园
  3. 让硬盘灯不再狂闪,调整Win7系统绝技(转)
  4. 苹果手机电池健康怎么看_电池的循环次数怎么看?关系到手机电池寿命
  5. 实录:记谷歌在微信脚下的一次翻车
  6. 智点木门软件为百闰门业解决哪些问题?
  7. 服务器未能识别是什么意思,服务器未能识别 HTTP 标头 SOAPAction 的值
  8. QQ浏览器不能播放视频怎么办?要如何解决
  9. AutoJs学习-变声器模板
  10. React官方文档教程学习