• 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);
    }
    }
     

      

  • 相关阅读:
    (圆形imageview 类似qq头像)---》(ps:引用第三库APAvatarImageView>
    uiscrollerview循环滚动(参考第三方库:HMBannerView)https://github.com/iunion/autoScrollBanner
    iOS -动态可变参数
    ios-UIPickerView基本使用
    iOS 实现进度条(progress)
    @property (nonatomic, getter = isExpanded) BOOL expanded;
    linker command failed with exit code 1 (use -v to see invocation)
    APICloud界面间跳转
    iOS CGRectGetMaxY/CGRectGetMaxX
    iOS UIView常用的一些方法setNeedsDisplay和setNeedsLayout 区别
  • 原文地址:https://www.cnblogs.com/cq-jiang/p/8609975.html
Copyright © 2020-2023  润新知