首页 > 代码库 > 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管理功能的实现