本文没有涉及到连接WIFI之后进行通讯,若有这方面的想法(例如两个客户端连接至同一WIFI后进行通讯),请关注后续文章一起讨论。
其实关于WIFI的开发的文章也非常的多,但是大部分只是简单的例子,不够全面,我这里是想写一个比较完整的WIFI应用,主要功能:
1.能够打开/关闭WIFI
2.能够扫面wifi并获取扫描结果
3.能够连接wifi,无论是什么加密方式
4.能够监听连接状态,如正在连接、正在获取ip、密码错误等
5.能够锁定wifi
6.能获取wifi的加密方式
7.开启热点
8.等等,大部分wifi操作常用的功能...
至于开发中用的几个相关类我就不做过多介绍了,网上比比皆是,还不了解的可以先看一下其他博客的介绍或者官方文档。
我尽量在代码中增加了一些注释,还是那句话:我还是个安卓小白,错误在所难免,如果有错误,希望大家多多指点。
一般使用WIFI流程:
1.打开wifi
1.1 状态监听
2.扫描wifi
3.连接wifi
4.关闭wifi
其中连接需要分几种情况:
1.如果是之前已经保存,直接连接
2.如果没有保存,必须先进行配置,再连接
2.1配置需要区分三种加密方式:无密码、WEP、WPA
3.WPS连接
那么就来打造一个简单demo,按照以上的步骤来。
开发流程
我们为了以后使用方便,直接编写一个wifi管理类,然后在activity直接调用对应方法就行了。下面着手进行这个类的编写:
0.在开始开发之前我们需要先配置相应的权限,如果是Android N以上级的动态申请位置权限哦
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 在android N 以上 需要添加位置权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
然后先看看我们需要准备什么全局变量
private WifiManager mWifiManager;//wifi管理器
private List<ScanResult> mScanResults;//扫描结果
private Context mContext;
private WifiStateReceiver mReceiver;//广播接收器
private WifiStateChangeListener mWifiStateChangeListener;//
private WifiManager.WifiLock mWifiLock;//WIFI锁
private static WiFiAdmin mWifiAdmin;//单利模式,
1.第一步,初始化wifi管理器并打开wifi
初始化
/***
* 构造方法 - - 由于使用单例,所以设为私有
* @param context
*/
private WiFiAdmin(Context context) {
mContext = context;
//如果使用activity的context则不能访问存储空间,在版本大于Android N时,因此使用全局的Context
mWifiManager = (WifiManager) mContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
mWifiLock = mWifiManager.createWifiLock("mlock");
}
打开wifi
public void openWifi() {
if (!mWifiManager.isWifiEnabled()) {
mWifiManager.setWifiEnabled(true);
}
}
2.注册广播,接收wifi的一些状态,例如正在连接、正在获取ip地址、断开连接等
private void registerWifiRecv() {
//注册广播
mReceiver = new WifiStateReceiver();
IntentFilter mFilter = new IntentFilter();
mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION); //信号强度变化
mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); //网络状态变化
mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); //wifi状态,是否连上,密码
mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); //是不是正在获得IP地址
mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
mContext.registerReceiver(mReceiver, mFilter);
isRegisterRecv = true;
}
3.既然注册了广播,那么我们肯定要处理对应结果
class WifiStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (!isRegisterRecv) return;//没注册监听就没必要执行之后的逻辑
String action = intent.getAction();
switch (action) {
case WifiManager.RSSI_CHANGED_ACTION:
//信号强度变化
mWifiStateChangeListener.onSignalStrengthChanged(getStrength(context));
break;
case WifiManager.NETWORK_STATE_CHANGED_ACTION:
NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if (info.getDetailedState().equals(NetworkInfo.DetailedState.DISCONNECTED)) {
//wifi已断开
mWifiStateChangeListener.onWifiDisconnect();
} else if (info.getDetailedState().equals(NetworkInfo.DetailedState.CONNECTING)) {
//正在连接...
mWifiStateChangeListener.onWifiConnecting();
} else if (info.getDetailedState().equals(NetworkInfo.DetailedState.CONNECTED)) {
//连接到网络
mWifiStateChangeListener.onWifiConnected();
}else if(info.getDetailedState().equals(NetworkInfo.DetailedState.OBTAINING_IPADDR)){
//正在获取IP地址
mWifiStateChangeListener.onWifiGettingIP();
}else if(info.getDetailedState().equals(NetworkInfo.DetailedState.FAILED)){
//连接失败
}
break;
case WifiManager.WIFI_STATE_CHANGED_ACTION:
int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
switch (wifiState) {
case WifiManager.WIFI_STATE_ENABLING:
//wifi正在启用
mWifiStateChangeListener.onWifiEnabling();
break;
case WifiManager.WIFI_STATE_ENABLED:
//Wifi已启用
mWifiStateChangeListener.onWifiEnable();
break;
}
break;
case WifiManager.SUPPLICANT_STATE_CHANGED_ACTION:
int error = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -100);
LogUtil.log("密码认证错误:"+error+"\n");
if (error==WifiManager.ERROR_AUTHENTICATING){
//wifi密码认证错误!
mWifiStateChangeListener.onPasswordError();
}
break;
case WifiManager.NETWORK_IDS_CHANGED_ACTION:
//已经配置的网络的ID可能发生变化时
mWifiStateChangeListener.onWifiIDChange();
break;
case ConnectivityManager.CONNECTIVITY_ACTION:
//连接状态发生变化,暂时没用到
int type = intent.getIntExtra(ConnectivityManager.EXTRA_NETWORK_TYPE,0);
break;
default:
break;
}
}
}
/**
* 计算信号强度
*
* @param context 含有WIFI信息的资源对象
* @return 信号强度
*/
private int getStrength(Context context) {
WifiInfo info = getConnectInfo();
if (info.getBSSID() != null) {
int strength = WifiManager.calculateSignalLevel(info.getRssi(), 5);
// 链接速度
// int speed = info.getLinkSpeed();
// // 链接速度单位
// String units = WifiInfo.LINK_SPEED_UNITS;
// // Wifi源名称
// String ssid = info.getSSID();
return strength;
}
return 0;
}
4.然后发起扫描并获取扫描结果
/**
* 启动扫描,扫描前应使用 {@link #getWifiState()}判断WIFI是否可用
* 或者在回调函数 mWifiStateChangeListener.onWifiEnable() 调用
*/
public void startWifiScan() {
mWifiManager.startScan();
mScanResults = mWifiManager.getScanResults();
}
5.获取到扫描结果之后,我们就可以发起连接了。对于之前已经连接过的wifi,可以直接这样:
public boolean connectWifi(int netId) {
return mWifiManager.enableNetwork(netId, true);
}
那么netid怎么来的?这就需要以下这些操作,首先要获取已经配置过(就是之前连接过的)的wifi
public WifiInfo getConnectInfo() {
return mWifiManager.getConnectionInfo();
}
使用以下方法获取netid,如果返回-1,证明没有配置,需要配置才能发起连接请求。
public int isWifiConfig(String ssid) {
List<WifiConfiguration> lists = getConfigWifiList();
for (WifiConfiguration c : lists) {
if (c.SSID.equals("\"" + ssid + "\"")) {
re

本文详细介绍了如何在Android中进行WIFI的基本操作,包括打开/关闭WIFI、扫描WiFi网络、连接不同加密方式的WiFi、监听连接状态以及开启热点。通过创建一个WiFi管理类,简化了在Activity中的调用流程,并提供了完整的代码示例,涵盖从初始化到连接的全过程,同时提到了可能遇到的问题和注意事项。最后,分享了一个GitHub上的完整demo链接供参考。
最低0.47元/天 解锁文章
658

被折叠的 条评论
为什么被折叠?



