android 高版本(设备11的)wifi扫描,获取wifi列表

需求场景:智能设备有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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值