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的朋友,可以到我的资源中去下载

时间: 2024-08-03 06:13:09

Android下自写类似系统wifi管理功能的实现的相关文章

浅析android下如何通过jni监控wifi网络连接、dhcpcd执行和power电源控制

浅析android下如何通过jni监控wifi网络连接.dhcpcd执行和power电源控制 =============================================================================================================libs/android_runtime/android_net_wifi_Wifi.cpp部分jni接口static JNINativeMethod gWifiMethods[] = {

Android 下拉刷新上拉载入效果功能

应用场景: 在App开发中,对于信息的获取与演示.不可能所有将其获取与演示.为了在用户使用中,给予用户以友好.方便的用户体验,以滑动.下拉的效果动态载入数据的要求就会出现.为此,该效果功能就须要应用到所须要的展示页面中. 知识点介绍: 本文主要依据开源项目android-pulltorefresh展开介绍. android-pulltorefresh [一个强大的拉动刷新开源项目,支持各种控件下拉刷新 ListView.ViewPager.WevView.ExpandableListView.G

Android下用Properties保存程序配置

读写函数分别例如以下: import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; public Properties loadConfig(Context context, String file) { Properties properties = new Properties(); try { FileInputStream s = new FileInputSt

Android停用和启用系统应用的逻辑

之前不少非官方系统会内置很多无法卸载的应用,让用户很恼火,不Root又没有办法.Android 4.0以后,谷歌为Android加入了停用系统应用的功能.最近有个客户有个需求,要求内置的Google Play默认处于停用状态,但是用户可以到设置>应用>已停用里进行"启用".今天就看一起相关代码的逻辑,看看这个需求能不能满足:

Android 使用动画效果后的控件位置处理 类似系统通知栏下拉动画

Android的动画的使用,请参考.Android的动画,在设计方面,我有点不太理解,觉得这样搞很怪,因为在控件动画后,即使设置了停留在动画结束时的位置,我们也确实看到了控件停在那个位置,但其实该控件的真实位置还是在原来动画前的那里.举个例子,如果有个Button,你给它设置了动画,让它移动到其他位置,当移动完成后,你会发现,点击Button没有任何效果,而在Button原来的位置,就是动画前的位置点击,明明没有任何控件,却看到了点击Button的效果.不知道Google为什么要这样设计.解决思

Android系统下载管理DownloadManager功能介绍及使用示例

http://www.trinea.cn/android/android-downloadmanager/ 本文主要结合源码介绍Android系统下载管理DownloadManager的强大功能及使用.这是许久来准备写的一系列博客,这篇主要介绍DownloadManager的功能和示例,后面还有两篇会介绍下载管理的底层设计(DownloadProvider.DownloadManager.DownloadManagerUI).下载管理如何进行功能增强和bug修改. 示例APK可从这些地址下载:G

Android WiFi管理(WIFI_SERVICE)

Android WiFi管理(WIFI_SERVICE) 分类: Android2011-11-24 10:52 2000人阅读 评论(1) 收藏 举报 androidservicebuttonlayoutencodingmobile [html] view plaincopy <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.an

cocos2d-x3.1 下实现类似Android下ExpandListView的效果

在左Android开始有SDK提供ExpandListView的可扩展列表,而在iOS下有许多第三方做好的Demo,这里我是参照iOS下RATreeView这个第三方库实现的. 本文代码:需要在3.1以上版本运行.如果是用3.0版本需要将Vec2换成Piont 原文地址:http://blog.csdn.net/qqmcy/article/details/29559241 代码下载:http://download.csdn.net/detail/qqmcy/7469387 下面说下使用方法: D

Android下WiFiDisplay功能探究

1 WiFiDisplay简介 1.1WiFiDisplay概述 WiFiDisplay(WFD)是WiFi联盟在已有技术的基础上,为了加速视/音频的传输分享而提出来的一个新概念.WiFi联盟对此成立了一个认证项目:Miracast-- 用来认证一个设备是否支持WiFiDisplay功能. 下图是WiFiDisplay功能的技术支撑体系,实际上最重要的部分就是WiFi Direct:也就是两个设备无需AP(AccessPoint)的情况下直接相连,这就奠定了两个带WiFi功能的设备能够随时传递高