美文网首页
Android 6.0 以上获取 Wifi 列表问题

Android 6.0 以上获取 Wifi 列表问题

作者: 方小钢 | 来源:发表于2017-05-09 02:07 被阅读2112次

    在已经打开 Wifi 的情况下获取 Wifi 时,wifiManager.getScanResults()方法始终返回的是 null。因为当时是在网上查询资料敲的代码,多找了几份资料后,看到代码都是一样的,反复确认自己有没有遗漏或者写错。甚至怀疑人生!索性克服心理恐惧点开源码,结果却找到了答案:

    /**
        * Return the results of the latest access point scan.
        * @return the list of access points found in the most recent scan. An app must hold
        * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION} or
        * {@link android.Manifest.permission#ACCESS_FINE_LOCATION ACCESS_FINE_LOCATION} permission
        * in order to get valid results.  If there is a remote exception (e.g., either a communication
        * problem with the system service or an exception within the framework) an empty list will be
        * returned.
        */
        
       public List<ScanResult> getScanResults() {
           try {
               return mService.getScanResults(mContext.getOpPackageName());
           } catch (RemoteException e) {
               throw e.rethrowFromSystemServer();
           }
       }
    
    原来还必须要有
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
    

    这两个权限的其中一个才行,因为android.permission.WRITE_SECURE_SETTINGS 权限必要要系统软件才能使用,所以要把 android.permission.ACCESS_FINE_LOCATION 加上,再打开 GPS,Wifi 列表果然就获取到了。

    想想这好可笑啊,获取个 Wifi 列表居然还要打开 GPS,于是针对这个问题精准的在 Google 找到了答案,原来是 Android 6.0 以后才加入了这个特性,难怪在以前的资料上没有提到。解决的办法有把编译的版本改回23之前(也就是6.0之前),就会绕过这个机制,成功获取Wifi列表。

    可是这也是权宜之计,最好的办法是在 Android 6.0 以上做判断,做一个动态权限管理,系统会询问 app 是否允许获得地理位置信息,用户点击了允许即可

    看来自己还是不要那么懒,或者害怕看源码,只有面对,正视源码才能慢慢成为一个优秀的开发者。

    相关文章

      网友评论

          本文标题:Android 6.0 以上获取 Wifi 列表问题

          本文链接:https://www.haomeiwen.com/subject/ztfbtxtx.html