android 获取wifi列表,如果你忽略了这个细节,可能你的软件会崩溃
一:业务描述
最近公司有一个小需求,用户点击wifi扫描按钮(注意:是用户主动点击wifi扫描按钮),app去扫描附近的wifi,显示在listView中,仅此而已,app都不用去连接某个wifi,看似简单的需求,如果没处理好,可能导致app直接挂掉。
二:代码如下
注册接收扫描wifi的广播
private void registerBroadcast(){
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
mContext.registerReceiver(mBroadcastReceiver,intentFilter);
}
启动扫描
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.scanWifi:
if (!wifiManager.isWifiEnabled()) {
//开启wifi
wifiManager.setWifiEnabled(true);
}
wifiManager.startScan();
wifiSsidRightIcon.setEnabled(false);
break;
}
}
获取扫描结果的广播
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String resultAction = intent.getAction();
Logger.e(TAG+"收到wifi相关的广播:"+resultAction);
//其它业务代码省略,如显示出一共有多少个wifi热点,以及刷新wifi热点的列表
}
}
三:问题描述
开发完成后,同事在测试该模块的时候,直接告诉我,app还没点击扫描wifi就挂了,我过去看到app的确挂了,是每次必挂,然而我通过记录的日志,看到如下信息:
03-19 15:42:56.471 2112-2112/com.advert E/PRETTYLOGGER: ║ ConfigHelperFragment$2.onReceive (ConfigHelperFragment.java:376)
03-19 15:42:56.471 2112-2112/com.advert E/PRETTYLOGGER: ║ ConfigHelperFragment:收到wifi相关的广播:android.net.wifi.SCAN_RESULTS
03-19 15:42:56.487 2112-2112/com.advert I/PRETTYLOGGER: ║ ConfigHelperFragment$2.onReceive (ConfigHelperFragment.java:387)
03-19 15:42:56.488 2112-2112/com.advert I/PRETTYLOGGER: ║ ConfigHelperFragment:扫描结果:Router-DK
03-19 15:42:58.838 2112-2112/com.advert E/PRETTYLOGGER: ║ ConfigHelperFragment$2.onReceive (ConfigHelperFragment.java:376)
03-19 15:42:58.839 2112-2112/com.advert E/PRETTYLOGGER: ║ ConfigHelperFragment:收到wifi相关的广播:android.net.wifi.SCAN_RESULTS
03-19 15:43:06.496 2112-2112/com.advert E/PRETTYLOGGER: ║ ConfigHelperFragment$2.onReceive (ConfigHelperFragment.java:376)
03-19 15:43:06.496 2112-2112/com.advert E/PRETTYLOGGER: ║ ConfigHelperFragment:收到wifi相关的广播:android.net.wifi.SCAN_RESULTS
03-19 15:43:06.515 2112-2112/com.advert I/PRETTYLOGGER: ║ ConfigHelperFragment$2.onReceive (ConfigHelperFragment.java:387)
03-19 15:43:06.515 2112-2112/com.advert I/PRETTYLOGGER: ║ ConfigHelperFragment:扫描结果:YTC
以上信息是,点击扫描wifi后,收到wifi扫描到结果的广播,关键是根本没有手动去点击启动扫描,还是收到了这个广播,并且是连续的收到这个广播,当时有点懵了,百度后也没找到类似的问题。静下心来仔细一想,肯定是其它程序触发了wifi扫描,所以才收到这个广播,但也说不过去,为什么会不停的收到这个广播呢?于是,我打开设置-WLAN,看到如下一幕:
上图是我连续看了近30秒,系统自带wifi列表,仔细看图一和图二第三项,wifi列表发生了变化,看到这里,导致软件挂掉的原因算是找到了,因为android设备wifi打开后,会自动扫描附近的wifi,如果有可用的wifi,设备直接连接,如果没有可用的wifi,设备会继续搜索,直到关闭wifi,或者搜索到可用的wifi为止。
为什么我本地没有出现问题,而同事测试就出现了,正是因为我测试的设备,已经连接上一个可用wifi热点,而同事的设备是新的,并且之前打开了wifi开关,所以导致了他测试时,app挂掉。知道是这个原因,解决这个问题就简单了,进入这个activity时,判断一下,如果当前wifi是打开的,直接关闭就ok.
代码如下:
public static void closeWifi(WifiManager wifiManager) {
if (wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(false);
}
}
android 获取wifi列表,如果你忽略了这个细节,可能你的软件会崩溃的更多相关文章
- android开发-获取wifi列表
近期博主在学frangment框架,因此想着想着就想通过listfragment完毕对wifi列表的获取. 好! 如今就不说废话了. 一.wifi的基础知识 在Android的官方文档中定义了例如以下 ...
- Android 获取WIFI MAC地址的方法
1. 经常用法,调用Android的API:WifiManager <uses-permission android:name="android.permission.ACCESS_W ...
- Android获取wifi MAC,关闭的wifi不能获取
最近一直在尝试着在Android上通过ndk用C++获取本机MAC地址,但是用ioctl(SIOCGIFHWADDR)时,一直返回值小于0,即获取不到接口信息.刚开始我以为是自己漏掉了哪些访问权限,所 ...
- Android 获取对象列表中的某一列 / 所有对象的某一字段,Realm数据库可获取某一字段所有值
现在项目用的数据库是Realm,所以想要获取数据库中某一字段的数据没有一句直接的语句进行获取,就像MySQL一样的select name from User,从User表里获取所有的name. 所以只 ...
- IOS零碎技术整理(3)-获取wifi列表
1. 该功能实现基于MobileApple80211框架来进行开发,而目前该框架成为了私有框架,其中的API均为私有API. 如果使用这些API可能导致应用不能上app store或者ios版本升 ...
- android 连接wifi案例
1.xml布局文件: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln ...
- iPhone,iPad如何获取WIFI名称即SSID
本文转载至 http://blog.csdn.net/wbw1985/article/details/20530281 2010年开始苹果清理了一批APP Store上的WIFI扫描软件, 缘由语焉 ...
- 【Android Developers Training】 98. 获取联系人列表
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- android程序获取WIFI的IP地址和MAC地址
转自:http://my.oschina.net/chenj/blog/68680 近日在鼓捣这玩意,拿出来大家分享一下,代码比较简单,如果有不懂的再问 <Button android:id=& ...
随机推荐
- Mysql根据指定字段的int值查出在当前列表的排名
先看表结构和数据: DROP TABLE IF EXISTS `ndb_record`; CREATE TABLE `ndb_record` ( `id` bigint(20) NOT NULL AU ...
- Eventlog控件的使用
CreateEventSource 已重载. 建立一个能够将事件信息写入到系统的特定日志中的应用程序. Delete 已重载. 移除日志资源. DeleteEventSource 已重载. 从事件日志 ...
- hdu1496 打表
通常可以想到直接四个for枚举,但是会超时.就算只用三个for也很危险.可以用打表的方法将时间复杂度降到O(n^2),注意到x1,x2,x3,x4的取值区间是关于零对称的,因此可以只考虑正整数部分,洗 ...
- 修长城 (区间DP)
Time Limit: 1000 ms Memory Limit: 256 MB Description 大家都知道,长城在自然条件下会被侵蚀,因此,我们需要修复.现在是21世纪,修复长城的事情当 ...
- 多项式A除以B
这个问题我是在PAT大区赛题里遇见的.题目如下: 多项式A除以B(25 分) 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数 ...
- FFmpeg-音频和视频应用程序的瑞士军刀
FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...
- dm642的中断定时器
TIMER_Handle TimerHandle0; void timer1() { ////////////定时器/////////////////////// TimerHandle0 = TI ...
- 错误代码: 1327 Undeclared variable: p_film_count
1.错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:SELECT FOUND_ROWS() INTO p_film_count ...
- (三十二)虚拟机linux系统中安装firefox浏览器
这几天,第二轮项目迭代进入了尾声,同时也接到了上司领导交代下来的新任务,那就是要我们学习linux系统基础的知识,包括常用命令和web应用的部署问题,于是乎安装了虚拟机和linux操作系统. 我安装的 ...
- DataTable复制数据,深度复制
/**/ /// <summary> /// 复制数据,深度复制 /// </summary> /// <param name="dataSourceRow&q ...