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=& ...
随机推荐
- VB 如何调用 c++ DLL?
``` ```Class MainWindow 'ByVal 值传递 ByRef 引用传递 'Function 有返回值 Sub 无返回值 'C语言数据类型在VisualBasic中声明为调用时使用的 ...
- zoj 3962 Seven Segment Display 数位dp
非常好的一个题,可以比赛时想到的状态太奇葩,不方便转移,就一直没能AC. 思路:dp(i, j)表示已经考虑了前i位,前i位的和为j的贡献.如果当前的选择一直是最大的选择,那么就必须从0~下一位的最大 ...
- SpringMvc Json LocalDateTime 互转,form urlencoded @ModelAttribute 转换
JDK8 的LocalDate 系列日期API ,比Date 或者 Calendar 都好用很多,但是在SpringMvc 自动装配会有点小问题 会导致抛出类似异常 default message [ ...
- 如何修改全部DevExpress控件的字体
引用:https://www.devexpress.com/Support/Center/Question/Details/A2761 You can change the default font ...
- 浅谈JavaScript位操作符
因为ECMAscript中所有数值都是以IEEE-75464格式存储,所以才会诞生了位操作符的概念. 位操作符作用于最基本的层次上,因为数值按位存储,所以位操作符的作用也就是操作数值的位.不过位操作符 ...
- Java线程编程中isAlive()和join()的使用详解
一个线程如何知道另一线程已经结束?Thread类提供了回答此问题的方法. 有两种方法可以判定一个线程是否结束.第一,可以在线程中调用isAlive().这种方法由Thread定义,它的通常形式如下: ...
- mysql学习笔记02 CRUD操作
添加数据insert into 表名(字段列表) values(对应字段的列表值) 查询数据 select *from 表名 where 条件select *from 表名 where 1条件 1表示 ...
- C#中的匿名函数使用,类名<T>
C#中有个叫做"泛型"的集合,就是说只是个外壳,到底是int,string,bool还是什么类型,都可以按照自己的要求进行定义集合,所以我们用个"T"表示. 请 ...
- Caused by: java.lang.ClassNotFoundException: javax.persistence.Entity
1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...
- Android的sdk、api及工程目录说明
SDK下包的说明1:add-ons:Android开发需要的第三方文件和软件库2:docs:Android的文档.包括开发指南.API参考.资源等3:extras:扩展的附加包4:platforms: ...