首先是权限,因为WIFI也是可以用于定位的,只是精度没那么高而已,所以6.0之后的权限系统对WIFI的权限进行了限制,除了需要日常的WIFI操作权限之外,还需要定位权限,否则会获取不到WIFI的信息。
1 <!--完全的网络访问权限--> 2 <uses-permission android:name="android.permission.INTERNET" /> 3 <!-- 以下是使用wifi访问网络所需的权限 --> 4 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 5 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 6 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 7 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 8 <!--定位权限--> 9 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 10 <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
大体步骤,就是:
1、显示列表(已连接、已保存的、已保存但没信号的等等,需要根据不同的状态区别显示并排序)
2、判定是否已经保存,如果保存了直接连接
3、没保存,提示输入密码,没有密码就跳过
4、代码自动将需要连接的WIFI以及密码,写入系统保存中,写了之后再进行连接
其他需要注意:保存了的忘了有可能也需要修改密码,SSID不能用作唯一码,因为WIFI名称是有可能是一样的。
下面是工具类代码:
1package com.imxiaoyu.common.utils; 2 3import android.app.Activity; 4import android.content.Context; 5import android.net.wifi.ScanResult; 6import android.net.wifi.WifiConfiguration; 7import android.net.wifi.WifiInfo; 8import android.net.wifi.WifiManager; 9import android.text.TextUtils; 10 11import com.imxiaoyu.common.base.helper.BaseHelper; 12 13import java.util.List; 14 15/** 16 * WIFI连接工具类 17 * Created by 庞光渝 on 2017/3/1. 18 */ 19 20public class WifiUtils extends BaseHelper { 21 22 private WifiManager wifiManager; 23 24 public WifiUtils(Activity activity) { 25 super(activity); 26 wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE); 27 doStartScan(); 28 } 29 30 /** 31 * 扫码、刷新WIFI 32 */ 33 public void doStartScan() { 34 wifiManager.startScan(); 35 } 36 37 38 /** 39 * 是否已经开启了WIFI 40 * @return 41 */ 42 public boolean isWifiOpen(){ 43 if(wifiManager==null){ 44 return false; 45 } 46 return wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED; 47 } 48 49 /** 50 * 开、关 WIFI 51 * 52 * @param bln 53 */ 54 public void doSwitchWifi(boolean bln) { 55 if (wifiManager != null) { 56 wifiManager.setWifiEnabled(bln); 57 } 58 } 59 60 /** 61 * 返回WIFI列表,并按信号强度排序 62 * 63 * @return 64 */ 65 public List<ScanResult> getScanResults() { 66 return ascWifiLevel(wifiManager.getScanResults());//得到扫描结果 67 } 68 69 /** 70 * 断开网络 71 */ 72 public void disableNetwork(int wifiId){ 73 wifiManager.disableNetwork(wifiId); 74 } 75 76 /** 77 * 不保存网络 78 * @param wifiId 79 */ 80 public void removeNetwork(int wifiId){ 81 wifiManager.removeNetwork(wifiId); 82 } 83 84 /** 85 * 不保存网络 86 * @param SSID 87 */ 88 public void removeNetwork(String SSID){ 89 removeNetwork(isConfiguration(SSID)); 90 } 91 92 /** 93 * 返回当前正在连接的WIFI的信息(正在连接,也包括没连接上或者密码错误状态,相当于是一个占位的状态) 94 * @return 95 */ 96 public WifiInfo getWifiInfo(){ 97 return wifiManager.getConnectionInfo(); 98 } 99 100 /** 101 * 得到配置好的(即已经保存了密码的)WIFI的信息 102 */ 103 public List<WifiConfiguration> getConfiguration() { 104 return wifiManager.getConfiguredNetworks(); 105 } 106 107 /** 108 * 判定指定的WIFI已经配置好,然后根据WIFI的地址bssid返回NETId; 109 * 110 * @param SSID WifiConfiguration这个列表的SSID是前后带有双引号的,传进来的时候一定要注意 111 * @return 112 */ 113 public int isConfiguration(String SSID) { 114 List<WifiConfiguration> wifiConfigurations = getConfiguration(); 115 if(wifiConfigurations!=null) { 116 for (int i = 0; i < wifiConfigurations.size(); i++) { 117 if (wifiConfigurations.get(i).SSID.equals(SSID)) {//地址相同 118 return wifiConfigurations.get(i).networkId; 119 } 120 } 121 } 122 return -1; 123 } 124 /** 125 * 判定指定的WIFI已经配置好,然后根据WIFI的地址bssid返回NETId; 126 * 127 * @param BSSID WifiConfiguration这个列表的SSID是前后带有双引号的,传进来的时候一定要注意 128 * @return 129 */ 130 public int isConfigurationBSSID(String BSSID) { 131 List<WifiConfiguration> wifiConfigurations = getConfiguration(); 132 if(wifiConfigurations!=null) { 133 for (int i = 0; i < wifiConfigurations.size(); i++) { 134 if (wifiConfigurations.get(i).BSSID!=null&&wifiConfigurations.get(i).BSSID.equals(BSSID)) {//地址相同 135 return wifiConfigurations.get(i).networkId; 136 } 137 } 138 } 139 return -1; 140 } 141 142 /** 143 * 添加指定WIFI的配置信息,原列表不存在此SSID 144 * 145 * @param wifiList 146 * @param ssid 147 * @param pwd 148 * @return 149 */ 150 public int addWifiConfig(List<ScanResult> wifiList, String ssid, String pwd) { 151 int wifiId = -1; 152 for (int i = 0; i < wifiList.size(); i++) { 153 ScanResult wifi = wifiList.get(i); 154 if (wifi.SSID.equals(ssid)) { 155 WifiConfiguration wifiCong = new WifiConfiguration(); 156 wifiCong.SSID = "\"" + wifi.SSID + "\"";//\"转义字符,代表" 157 wifiCong.preSharedKey = "\"" + pwd + "\"";//WPA-PSK密码 158 wifiCong.hiddenSSID = false; 159 wifiCong.status = WifiConfiguration.Status.ENABLED; 160 wifiId = wifiManager.addNetwork(wifiCong);//将配置好的特定WIFI密码信息添加,添加完成后默认是不激活状态,成功返回ID,否则为-1 161 if (wifiId != -1) { 162 return wifiId; 163 } 164 } 165 } 166 return wifiId; 167 } 168 169 /** 170 * 连接指定的WIFI 171 * 172 * @param wifiId 173 * @return 174 */ 175 public boolean doConnectWifi(int wifiId) { 176 List<WifiConfiguration> wifiConfigurations = getConfiguration(); 177 for (int i = 0; i < wifiConfigurations.size(); i++) { 178 WifiConfiguration wifi = wifiConfigurations.get(i); 179 if (wifi.networkId == wifiId) { 180 while (!(wifiManager.enableNetwork(wifiId, true))) {//激活该Id,建立连接 181 //status:0--已经连接,1--不可连接,2--可以连接 182 ALog.e("ConnectWifi", String.valueOf(wifiConfigurations.get(wifiId).status)); 183 } 184 return true; 185 } 186 } 187 return false; 188 } 189 190 /** 191 * 取消保存 192 * 193 * @param networkID 194 */ 195 public void removeNetword(int networkID) { 196 wifiManager.removeNetwork(networkID); 197 wifiManager.saveConfiguration(); 198 } 199 200 /** 201 * 排序一下信号强度 202 * 203 * @param list 204 * @return 205 */ 206 public static List<ScanResult> ascWifiLevel(List<ScanResult> list) { 207 for (int i = 0; i < list.size(); i++) { 208 for (int j = 0; j < list.size() - 1; j++) { 209 if (list.get(j).level < list.get(j + 1).level) { 210 ScanResult scanResult = list.get(j); 211 list.set(j, list.get(j + 1)); 212 list.set(j + 1, scanResult); 213 } 214 } 215 } 216 return list; 217 } 218 219 /** 220 * 返回一个WIFI的加密方式 221 * 222 * @param ssid 223 * @return 224 */ 225 public String getCipherType(String ssid) { 226 WifiManager wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE); 227 228 List<ScanResult> list = wifiManager.getScanResults(); 229 230 for (ScanResult scResult : list) { 231 if (!TextUtils.isEmpty(scResult.SSID) && scResult.SSID.equals(ssid)) { 232 String capabilities = scResult.capabilities; 233 if (!TextUtils.isEmpty(capabilities)) { 234 235 if (capabilities.contains("WPA") || capabilities.contains("wpa")) { 236 return "WAP"; 237 238 } else if (capabilities.contains("WEP") || capabilities.contains("wep")) { 239 return "WEP"; 240 } else { 241 return null; 242 } 243 } 244 } 245 } 246 return null; 247 } 248}
参考博客:
1http://blog.csdn.net/caoliang0921/article/details/8799530 2http://www.soso.io/article/100080.html 3http://blog.csdn.net/u014774589/article/details/48950727