android 自动连接WiFi
很久没有写博客了,今天记录下做项目中发现的问题,关于自动连接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相关推荐
- Android自动连接指定的WiFi热点
Android自动连接指定的WiFi热点 "Android自动连接指定的WiFi热点",看上去这是个再基础不过的功能了.很多人都觉得很简单,网上也有大量的资料.但在以Android ...
- Android 10自动连接WiFi问题 Android 10 断开WiFi问题
说明:本文主要说明扫码之后自动连接WiFi的一些处理,扫码的流程相对简单,网上教程也比较多,对于目前Android各个版本也没有太多变化. 问题描述:最近在做项目的时候,发现以前的项目有扫描二维码自动 ...
- android 手动连接wifi,android手动连接wifi的过程
android手动连接wifi的过程 下面就以手动连接mtk5931的wifi为列,来说明手动连接wifi的过程. 在此之前,先说明下,手动连接的使用场景和作用: a: 在纯linux的环境下,该手动 ...
- TQ2440 mifi驱动及开机自动连接wifi全过程
想让你的 ARM 也能上网吗?那么请跟我来: 前期准备:买一个小米wifi(淘宝直接搜) 下载linux2.6.30:已共享到我的网盘: http://pan.baidu.com/s/1kUbhoGZ ...
- iOS App无需跳转系统设置自动连接Wi-Fi
一: 介绍 近几年,智能设备越来越火,这些智能设备中,有很大一部分是通过手机来控制硬件设备,来达到预期的效果,这中间少不了要使用到蓝牙功能,通过蓝牙来通信来控制设备. 除了蓝牙控制设备之外,还可以通过 ...
- archlinux 开机自动连接wifi
archlinux 开机自动连接wifi archlinux 开机后连接wifi很简单 利用wifi-menu命令就可以选择热点和输入密码 但是重启后又要再来一次. 如果安装了gui, 当然可以利用N ...
- android 获取连接WiFi的名称
今天,简单讲讲如何获取连接的WiFi的名称. 首先AndroidMainfest.xml文件中添加权限: <uses-permission android:name="android. ...
- deepin开机未登录自动连接wifi
deepin在开机后没有登录进系统前,不会自动连接wifi.这点对于远程不方便. 另外,如果是使用字符界面启动,也不会连接wifi. 方法很简单: nmcli device wifi connect ...
- html5 自动连接wifi,怎么设置自动切换wifi 点击右上角的【高级设置】
怎么停止手机WIFI自动切换 安卓手机设置禁止自动连接WiFi的方法: 在此以"小米4"手机为例,打开手机"设置"界面,点击"WLAN"项进 ...
- android wifi连接流程,(九十三) Android O 连接WiFi AP流程梳理续——保存网络-Go语言中文社区...
前言: 之前在(五十五)Android O 连接WiFi AP流程梳理 梳理连接流程梳理到SupplicantStaNetworkHal 然后没梳理的下去,现在继续梳理下. 之前梳理的时序图 1.流程 ...
最新文章
- 在绘制USB2.O设备接口差分线时,应注意以下几点要求:
- PHP CLI模式开发
- 一个使用numpy.ones()的矩阵| 使用Python的线性代数
- UNION、UNION ALL和EXISTS
- 给Editplus去掉.bak文件
- 图像识别中的边框回归笔记,终于搞明白了啊!
- 李占通他道出了我的心声
- 关于Tween的几个注意事项
- 中国大学MOOC中华茶礼仪真题及答案
- Python: PS 滤镜--马赛克
- 服务器配置信息怎么查看,查看服务器配置信息
- widows下如何修改Visual Studio2017的字体颜色
- Ajax提交与submit提交对比
- HTTP版本之间的区别
- iOS开发之加载、滑动翻阅大量图片优化解决方案
- 与黑客讨价还价,勒索攻击企业数据是关键
- 购入计算机设备一批验收入库,购入并已验收入库的原材料如何做会计分录
- python 语法基础篇
- (2) 机器视觉技术发展的五大趋势
- USB摄像头显示为VMare USB device