前言此篇博客讲解WiFi正常功能开发与热点功能开发
权限不管是WiFi正常功能还是WiFi热点都需要以下权限,Android5.0还需要动态权限
WiFi正常功能(扫描/连接/断开)初始化WiFi管理操作WiFi的基础类,所有的WiFi操作都需要使用这个管理类
WifiManager mWifiManager = (WifiManager)getApplicationContext.getSystemService(Context.WIFI_SERVICE);判断WiFi状态这个是判断设备的WiFi硬件状态,一共有已经几种设备状态:
WIFI_STATE_DISABLED WiFi已经禁用WIFI_STATE_DISABLING 正在禁用WiFi中WIFI_STATE_ENABLED WiFi已经启用WIFI_STATE_ENABLING 正在启用WiFi中WIFI_STATE_UNKNOWN 设备状态未知(或者没有WiFi硬件支持)
if (mWifiManager.getWifiState == WifiManager.WIFI_STATE_DISABLED){Log.e(TAG, “WiFi已经启用”);}
判断WiFi是否开启这是官方提供的更快捷判断WiFi是否开启的方法
if (mWifiManager.isWifiEnabled){Log.e(TAG, “WiFi已经开启”);}else {Log.e(TAG, “WiFi已经关闭”);}开启或者关闭WiFi用此方法开启WiFi会有一个系统弹窗提示用户手动开启WiFi.
mWifiManager.setWifiEnabled(true); //false为关闭 搜索WiFi与获取WiFi设备列表private void scan{mWifiManager.startScan; //搜索WiFi,在这个代码的注释里有说明搜索过程是异步的Handler handler = new Handler;handler.postDelayed(new Runnable {@Overridepublic void run {List
注意一! mWifiManager.getScanResults 得到的List里面的数据其实是一直会变化的! 意思是计算你获取到了这个list,在WiFi的底层代码里依然会修改/增加/删除这个list里的数据
注意二! mWifiManager.getScanResults 得到的List里面的数据会出现重复/空名/个别值为null的问题,这是正常的.所以WiFi的难点不是连接与搜索,而是清洗数据
WifiActivity: ==================================WifiActivity: scan: wifi 名称=WETOOL_2.4GWifiActivity: scan: wifi WiFi地址=08:9b:4b:9d:25:b5WifiActivity: scan: wifi 加密方式=[WPA2-PSK+FT/PSK-CCMP][ESS]WifiActivity: ==================================WifiActivity: scan: wifi 名称=2_5gWifiActivity: scan: wifi WiFi地址=d0:ee:07:59:64:18WifiActivity: scan: wifi 加密方式=[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]WifiActivity: ==================================WifiActivity: scan: wifi 名称=喵星人的WiFiWifiActivity: scan: wifi WiFi地址=6c:88:14:f4:f3:5dWifiActivity: scan: wifi 加密方式=[WPA2-PSK-CCMP][ESS]ScanResult可以获取的信息ScanResult是搜索到WiFi列表后获取的单个WiFi信息,里面包含了一些信息需要了解一下(注意,如果你看源码会发现有很多信息是隐藏的无法调用的.那些变量都是系统级别的API才能调用,这里只说明可以看到的信息)
CharSequence area = scanResult.venueName; //WiFi接入点的地点名称int frequency = scanResult.frequency; //频率long refreshTime = scanResult.timestamp; //此WiFi最新的刷新时间戳int level = scanResult.level; //信号强度String encryption = scanResult.capabilities;//加密方式 例如:WEP/WAP/WAP2String address = scanResult.BSSID; //WiFi的地址String name = scanResult.SSID; //WiFi的名称连接指定的WIiFi网络这段流程比较长,大致是这样的:
1.搜索WiFi,找到指定WiFi 获取名称/地址/加密方式,以及你自己知道的WiFi密码
2.创建WiFi配置信息WifiConfiguration, 添加WiFi名称,地址
3.在根据加密方式以对应的方式添加密码到WifiConfiguration
4.将WiFi配置WifiConfiguration,添加到以配置的网络列表里addNetwork(wifiConfiguration);
5.获取已经配置好的网络列表mWifiManager.getConfiguredNetworks;,找到指定WiFi,获取id
6.断开现在正在连接的WiFi,输入id启用设置好的WiFi,重新连接
注意! scanResult.BSSID 这个BSSID其实动态生成的路由地址,不可以依靠这来判断wifi的唯一性. 所以用SSID加BSSID来锁定一个WiFi是不现实的.因为有时候BSSID其实是null的.只能使用SSID来判断WiFi,遇到重名WiFi没有什么办法
public void scan{List