安卓开发

android wifi开发

前言此篇博客讲解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 list = mWifiManager.getScanResults(); //获取WiFi列表for (ScanResult scanResult : list){Log.e(TAG, “==================================”);Log.e(TAG, “scan: wifi 名称=”+scanResult.SSID);Log.e(TAG, “scan: wifi WiFi地址=”+scanResult.BSSID);Log.e(TAG, “scan: wifi 加密方式=”+scanResult.capabilities);}}},1000);} 开始搜索是一个异步的过程,你可以直接获取WiFi列表(有可能还是上次的搜索结果),也可以写个Handler等待几秒在获取WiFi列表.

注意一! 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 list = mWifiManager.getScanResults(); //获取WiFi列表Log.e(TAG, “list 长度=”+list.size());for (ScanResult scanResult : list){if (scanResult.SSID.equals(“My_5g”)){ //找到我们需要的WiFiconnectionWifi(scanResult.SSID,”winteam0901″, scanResult.capabilities); //连接它}

Similar Posts

发表评论

邮箱地址不会被公开。 必填项已用*标注