首页 > 代码库 > Android下自写类似系统wifi管理功能的实现
Android下自写类似系统wifi管理功能的实现
经常有人问到关于Android下WIFI管理的问题,询问个中归于wifi的操作,下面我就写写如何在Android下实现类似Android系统自带wifi管理功能的步骤,通过这个的学习,相信关于android下wifi的操作,我们基本都能掌握了:
第一、说说界面布局
界面很简单:
顶部一个刷新按钮和一个WIFI开关
下部一个listview,每一行就是一个扫描到的wifi信息,显示它的SSID、加密类型,信号强度,是否已经连接
第二、关于列表的获取
如何获取wifi扫描列表呢?wifiManager类的getScanResult()方法就直接可以获取,只不过不建议大家在代码开始的时候直接通过getScanResult()获取,比较科学的流程是:
1、注册wifi扫描结果变化广播,监听wifi列表改变情况
2、调用wifiManager的startScan()方法请求重新扫描附近的wifi热点信息
3、在广播接收器中处理调用getScanResult()方法,获取wifi扫描结果,在listview山显示,这里需要注意的是,好多场所为了无缝覆盖,会布设多个SSID相同的无线热点,在我们获得的ScanResult中,会每个都存在,但是我们观察系统的wifi管理,同名的列表会被合并,所以我们也需要合并,同名的,只显示信号最强的那个就ok
关键代码段如下:
private void regWifiReceiver() { IntentFilter labelIntentFilter = new IntentFilter(); labelIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); labelIntentFilter.setPriority(1000); // 设置优先级,最高为1000 context.registerReceiver(wifiResultChange, labelIntentFilter); }
</pre><pre name="code" class="java"><pre name="code" class="java">// 剔除ssid中的重复项,只保留相同ssid中信号最强的哪一个 List<ScanResult> wifiList = wifiManager.getScanResults(); List<ScanResult> newWifList = new ArrayList<ScanResult>(); boolean isAdd = true; if (wifiList != null) { for (int i = 0; i < wifiList.size(); i++) { isAdd = true; for (int j = 0; j < newWifList.size(); j++) { if (newWifList.get(j).SSID.equals(wifiList.get(i).SSID)) { isAdd = false; if (newWifList.get(j).level < wifiList.get(i).level) { // ssid相同且新的信号更强 newWifList.remove(j); newWifList.add(wifiList.get(i)); break; } } } if (isAdd) newWifList.add(wifiList.get(i)); } }
第三、关于连接
既然我们已经获取了列表,那么,如何连接呢?
我们遵循以下逻辑,若用户点击了某一行,我们按下面的逻辑处理:
1、如果刚好目前我们连接到此热点上,则显示一个对话框,提示用户“忘记”或者“断开”(分别是wifiManager的removeNetwork()方法和disconnect()方法),结束流程
2、如果此热点信息本机之前配置过,则显示一个对话框,提示用户“忘记”或者“连接”(分别是wifiManager的removeNetwork()方法和enableNetwork()方法),结束流程
3、如果此热点是有密码的热点,弹出密码输入框,提示用户输入密码,输入密码后,连接之
4、如果此热点无密码,弹出提示框,提示无密码,可能不安全,让用户选择是否连接
第四、如何连接一个本机已配置的热点
对于本机已配置的热点,我们需要获取其netid,然后enableNetwork(netid),但是,直接这样的话,你会发现经常无法连接成功,系统会经常自动连接到目前已连接的热点上,而不是我们指定的热点,问题就在于热点的配置文件(WifiConfiguration类)中有一个优先级(priority)属性,系统会自动连接priority最高的热点,所以问题来了,我们需要在enableNetwork(netid)之前,将netid对应的热点在系统中的配置信息的priority调整为最大
好了,有了上述的思路及步骤,完成类似系统wifi管理的功能就很easy了!
欢迎交流QQ:568626884
需要完整demo的朋友,可以到我的资源中去下载
Android下自写类似系统wifi管理功能的实现