前言
此篇博客讲解WiFi正常功能开发与热点功能开发,但是请注意,这里的API版本是28,Android9.0。 因为Android10 wifi的调用完全不一样了。
转载请注明来源:https://www.cnblogs.com/guanxinjing/p/9708586.html
权限
不管是WiFi正常功能还是WiFi热点都需要以下权限,Android5.0还需要动态权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
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设备列表
/**
* 搜索WiFi
*/
fun scan() {
mWifiManager.isScanAlwaysAvailable
mWifiManager.startScan()
}
/**
* 注册搜索结果监听
*/
private fun registerReceiver(context: Context) {
val wiFiChangeReceiver = WiFiChangeReceiver()
val intentFilter = IntentFilter()
//搜索Wifi扫描已完成,并且结果可用
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
context.registerReceiver(wiFiChangeReceiver, intentFilter)
}
/**
* 获取搜索到的设备
*/
@SuppressLint("MissingPermission")
private suspend fun getScanDevice() {
val list: List<ScanResult> = mWifiManager.scanResults //获取WiFi列表
for (scanResult in list) {
Log.e("zh", "getScanDevice: ${scanResult}" )
}
}
inner class WiFiChangeReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
//搜索完成
if (intent.action == WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) {
GlobalScope.launch(Dispatchers.Main) {
val list = withContext(Dispatchers.IO) { getScanDevice() }
}
}
}
}
搜索是一个异步的过程,你可以依靠广播回调获取WiFi数据, 也可以立即获取WiFi数据,但是立即获取可能是旧的WiFi数据。
注意一! mWifiManager.getScanResults() 得到的List里面的数据其实是一直会变化的! 意思是计算你获取到了这个list,在WiFi的底层代码里依然会修改/增加/删除这个list里的数据
注意二! mWifiManager.getScanResults() 得到的List里面的数据会出现重复/空名/个别值为null的问题,这是正常的.所以WiFi的难点不是连接与搜索,而是清洗数据
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/WAP2
String address = scanResult.BSSID; //WiFi的地址
String name = scanResult.SSID; //WiFi的名称
连接指定的WIiFi网络(API28)
请注意!此代码在Android10 API29的版本上已经无法使用 在新的API 29的SDK中