博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 打开WIFI并快速获取WIFI的信息
阅读量:5872 次
发布时间:2019-06-19

本文共 4163 字,大约阅读时间需要 13 分钟。

hot3.png

转载请标明出处:

本文出自:

网上关于如何用代码设置wifi的文章一搜一大堆,我在此就不再添乱了,我就试着给大家谈一谈我遇到的问题吧。

首先,我在做有系统定制某App的wifi模块的项目需求时候,系统默认在出厂设置的时候wifi 是关闭的,当打开连接wifi(获取wifi信息列表)的页面的时候,我要初始化把wifi打开,这个时候直接获取wifi列表,却迟迟没有数据返回,后来我又监听了

`WifiManager.SCAN_RESULTS_AVAILABLE_ACTION`,

这个广播,收到广播的时候再去获取wifi信息,果然,获取到了,可是这时候有个问题,哎妈呀,当wifi打开的时候,去调用这个

`mWifiManager.startScan();`

去扫描wifi ,等收到上面这个广播之后再去获取wifi,

mScanResults = mWifiManager.getScanResults();

但是这个期间却要等待12左右才获取到wifi的数据信息,对于一个产品,用户的体验来说,肯定是不合理的,当时,我也找了好多资料,却都没怎么说这方面的内容,苦了好久,也没想明白,因为也不甜熟悉这一块,后来就去Android 官网查看Wifi相关的API ,收获却不小,但是这个Bug还是没头绪,于是就单独写了一个小Demo 来一步一步测试,贴代码,再详细说明:

我们添加两个按钮,开启Wifi,关闭wifi:

MainActivity:

/** * 打开wifi功能 * true:打开成功; * false:打开失败 */    public boolean openWifi() {        boolean bRet = true;        if (!mWifiManager.isWifiEnabled()) {            bRet = mWifiManager.setWifiEnabled(true);        }        return bRet;    }    /** * Function:关闭wifi * @return
*/ public boolean closeWifi() { if (mWifiManager.isWifiEnabled()) { return mWifiManager.setWifiEnabled(false); } return false; }

当进入这个页面的时候就去注册广播,然后先去手动打开wifi,调用openWifi()方法,

/** * 注册广播 */    private void registerBroadcast() {        IntentFilter filter = new IntentFilter();        filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);        registerReceiver(mReceiver, filter);    }

打印出相应的Log时间差信息:

/** * 打开wifi */        openWifi.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                openWifi();                Log.d(TAG, "开启" + DateUtils.getCurrentDateString());                mWifiManager.startScan();            }        });        /** * 关闭wifi */        closeWifi.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                closeWifi();                Log.d(TAG, "关闭" + DateUtils.getCurrentDateString());            }        });

接收广播的时候也输出相应的日志信息,如果在接收到

WifiManager.SCAN_RESULTS_AVAILABLE_ACTION

这个广播的时候再去扫描wifi信息;

mWifiManager.startScan();mScanResults = mWifiManager.getScanResults();

这个时候去看log输出的接收到这个广播的时间,代码如下:

/** * 广播接收,监听网络 */    private BroadcastReceiver mReceiver = new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            final String action = intent.getAction();            // wifi已成功扫描到可用wifi。            if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {                Log.d(TAG, "接收到" +DateUtils.getCurrentDateString());                mWifiManager.startScan();                mScanResults = mWifiManager.getScanResults();                Log.d(TAG, "mScanResults.size()===" + mScanResults.size());            }         }    };

这个时候我就监听了这一个广播,log日志看图:

这里写图片描述

看上面的时间差就等候了近13秒左右才出来结果,就是为了解决这个问题,又去看有关的资料和API,后来有添加一个广播。

filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);

更改后,在监听这个系统wifi打开时候,就去扫描wifi,

/** * 广播接收,监听网络 */    private BroadcastReceiver mReceiver = new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            final String action = intent.getAction();            // wifi已成功扫描到可用wifi。            if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {                Log.d(TAG, "接收到" +DateUtils.getCurrentDateString());                mScanResults = mWifiManager.getScanResults();                Log.d(TAG, "mScanResults.size()===" + mScanResults.size());            }             //系统wifi的状态            else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {                int wifiState = intent.getIntExtra(                        WifiManager.EXTRA_WIFI_STATE, 0);                switch (wifiState) {                case WifiManager.WIFI_STATE_ENABLED:                    Log.d(TAG, "WiFi已启用" + DateUtils.getCurrentTime());                    mWifiManager.startScan(); <<

运行后看下log日志:

这里写图片描述

demo会放在后面附件里

惊奇的发现,哇哦!这个速度到wifi数据显示的时间差就在2秒左右哦,非常棒!这个就是我们想要的效果~,当然了,其实还要更多的方法同样能实现这样的效果,本人能力有限,还是自己不够用心,基础不扎实,不够努力,导致了这样,那样的问题。在别人眼里,虽然没什么难度,但是终究自己弄了个小demo 测试了出来,就把遇到问题就分享给了大家,以后慢慢学会写博客~

等这段时间忙完了,我正整理一下连接wifi的相关操作的完整demo,到时候再更新博客~

Demo下载:

转载于:https://my.oschina.net/xuhaozi/blog/634418

你可能感兴趣的文章
Jquery弹窗
查看>>
生日小助手
查看>>
bzoj 2194 快速傅立叶之二
查看>>
51nod 1443 路径和树——最短路生成树
查看>>
17th, Jan 2012 今天的时间表
查看>>
[精华][推荐]CAS SSO 实现单点登录实例源码
查看>>
IIS 部署WCF时遇到这么个错:
查看>>
VSS Teamwork 环境架设[文章汇编集]
查看>>
VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的
查看>>
拓扑资料
查看>>
x86_64平台编译链接汇编程序
查看>>
POJ3126 Prime Path(BFS)
查看>>
VC6.0多线程例程
查看>>
Unity 3D-AR开发-Vuforia教程手册
查看>>
放球问题 组合数学 转自百度百科
查看>>
神经网络的火热
查看>>
视图之一--创建简单的视图
查看>>
for循环实例
查看>>
N1试卷常考词汇总结
查看>>
构建之法阅读笔记(1)
查看>>