Android 6.0以上获取Wifi列表问题

Posted sanxiandoupi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 6.0以上获取Wifi列表问题相关的知识,希望对你有一定的参考价值。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 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.getScan 大专栏  Android 6.0以上获取Wifi列表问题Results(mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}

原来还必须要有

1
2
<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是否允许获得地理位置信息,用户点击了允许即可

技术图片

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


fangxiaogang

技术图片

以上是关于Android 6.0以上获取Wifi列表问题的主要内容,如果未能解决你的问题,请参考以下文章

Android 6.0以上动态获取权限问题,百度语音识别

获取WIFI列表及连接WIFI适配6.0 这一篇真的够了

在 Android 6.0 中获取 MAC 地址

如何使用 xamarin android 应用程序获取 wifi 列表

如何获取可用的 wifi 网络并将它们显示在 android 的列表中

SCAN_RESULTS_AVAILABLE_ACTION 在 Android 6.0 中返回空列表