需求场景:智能设备有wifi模块,整套wifi功能,包括:搜索wifi列表,wifi连接,wifi切换,wifi忘记密码等。
高版本(安卓8以上)为了省电,节流,谷歌对wifi限制越来越多,安卓9以上前台两分钟内最多刷新4次,(PS:实际我写的时候,感觉最多刷新两次,甚至一次,之后调用startSacn(),getScanResults() 方法,都是秒响应,获取上一次的wifi信息 - -! 很操蛋)
网上找了很多资源,有监听系统wifi列表的,试了,不好使。
理想的解决方案:
调用刷新的时候,给硬件发送一个自定义广播,硬件那边收到之后,后台刷新系统wifi列表,硬件只需要做刷新即可,毕竟前台监听系统wifi列表广播,硬件刷新wifi之后,前台可以直接展示最新的wifi列表信息。但是我们硬件....不会搞啊。- -
我的解决方案:
开发者选项中,有一个 “WLAN扫描调节” 的选项,让硬件默认关闭掉,这样前台应用就可以算是及时刷新附件wifi列表了,(PS:算是及时吧,打个比方,手机开热点,前台应用点击扫描wifi,第一遍刷新不出来,第二遍就出来了,关闭热点,第一遍wifi热点还在,第二遍扫描就没了)
代码如下:
@Override
protected void onResume() {
super.onResume();
ScanWifiInfo();
}
private ArrayList<ScanResult> mWifiList = new ArrayList<>();
@SuppressLint("WifiManagerLeak")
private void ScanWifiInfo() {
mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
mWifiManager.startScan(); //启动扫描
WaitDialog.show("搜索附进wifi...");
//wifi显示列表
mWifiList.clear();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
List<ScanResult> scanResults = mWifiManager.getScanResults();//搜索到的设备列表
WifiInfo mWifiInfo = mWifiManager.getConnectionInfo();
WaitDialog.dismiss();
List<ScanResult> newScanResultList = new ArrayList<>();
for (ScanResult scanResult : scanResults) {
int position = getItemPosition(newScanResultList, scanResult);
if (position != -1) {
if (newScanResultList.get(position).level < scanResult.level) {
newScanResultList.remove(position);
newScanResultList.add(position, scanResult);
}
} else {
newScanResultList.add(scanResult);
}
}
//查看是哪个wifi已连接
String ssid = mWifiInfo.getSSID().replace("\"", "");
for (int i = 0; i < newScanResultList.size(); i++) {
String ssid1 = newScanResultList.get(i).SSID;
//判断,哪个wifi连接就放集合第一个
if (mWifiInfo != null && ssid.equals(ssid1)) {
// LogUtil.e(scanResultList.get(i).SSID + " level:" + scanResultList.get(i).level + "是否连接:" + "是");
mWifiList.add(0, newScanResultList.get(i));
mAdapter.notifyDataSetChanged();
} else {
// LogUtil.e(scanResultList.get(i).SSID + " level:" + scanResultList.get(i).level + "是否连接:" + "否");
mWifiList.add(newScanResultList.get(i));
mAdapter.notifyDataSetChanged();
}
LogUtil.e("wifi名字:" + newScanResultList.get(i).SSID);
}
mAdapter.notifyDataSetChanged();
}
}, 6000);
}
/**
* 返回item在list中的坐标
*/
private int getItemPosition(List<ScanResult> list, ScanResult item) {
for (int i = 0; i < list.size(); i++) {
if (item.SSID.equals(list.get(i).SSID)) {
return i;
}
}
return -1;
}
手动刷新点击事件:
//刷新wifi
mScan_line.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ScanWifiInfo();
}
});
扫描wifi列表ok.