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

原文地址:https://www.cnblogs.com/sanxiandoupi/p/11712910.html

时间: 2024-11-05 18:48:34

Android 6.0以上获取Wifi列表问题的相关文章

Android入门笔记2——获取传感器列表

? UI界面: ? Xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" an

iOS 获取 WiFi 列表

IOS 获取 WIFi列表有2016 /11 / 10 之后就不用申请权限了  Apple 官方邮件回复: Thank you for requesting information about the Network Extension framework. Please note that as of November 10, 2016 this process is not required for developers who wish to use App Proxy, Content

android 4.0的多选列表使用

android 4.0的多选列表使用 这个用着还是挺方便的. [java] view plaincopy ListView mList = getListView(); ModeCallback multiListener =newModeCallback(); mList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); mList.setMultiChoiceModeListener(multiListener);//要添加这个监听 pu

安卓模拟器Android SDK Manager 无法获取SDK列表的解决办法

1.打开运行Android SDK Manager ,Tool菜单,选择Options,打开设置菜单,勾选“Force https://...sources to be fetched using http://...”,,然后点Close关闭,如下图: 2.设置hostes文件能电脑能正常访问Google下载中心 打开C:\Windows\System32\drivers\etc文件夹,双击hosts文件,选择使用记事本打开,把以下代码加到hosts文件中. 74.125.113.121 de

获取WIFI列表,在旧手机上运行就没有问题,在新手机上就怎么也获取不到WIFI列表,长度一直为0,还不报异常,很疑惑。

新手机获取不到WIFI列表的原因: 获取不到列表首先要考虑的是6.0动态权限的问题 解决方案: (1) 将SDK版本改为23以下,例如22,但是这样就要放弃SDK的新特性 (2) 使用动态授权,接收用户授权的信息,根据用户授权的信息作出操作

android 6.0 系统获取权限

在Android 6.0 (API 23) 发布之前, 所有的权限都在安装应用的时候显示给用户,用户选择安装则表示全部接受这些权限, 之后无法撤销对这些权限的授权.但Android 6.0开始, 一部分比较危险的权限需要在程序运行时显式弹框,请求用户授权.所以,之前开发应用时,在manifest文件中配置对应的权限这种做法便达不到之前的效果.那么,现在要怎么做呢?提供两种思路,仅供参考: 1:判断android系统的版本,如果不是6.0及以上,按正常逻辑处理,如果是,则去打开系统弹框,请求系统权

Qt for android 获取 Wifi 列表

Qt 做 Android 开发,有时候需要网络信息,这个例子是获取手机搜索到的信号较强的 WIFI 信号的列表.过程中需要用到 JNI 的知识.另外,例子比较简单,如果有需要这个的,可以自行修改. 程序分为两个部分,一个是 JAVA 程序的编写,一个是 Qt 主程序的编写,至于对 AndroidManifest.xml 文件的修改部分我就不加缀述了. JAVA 程序部分: package com.wifi; import android.net.wifi.ScanResult; import a

获取wifi列表

- (id)fetchSSIDInfo {       NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();       NSLog(@"Supported interfaces: %@", ifs);       id info = nil;       for (NSString *ifnam in ifs) {           info = (__bridge_transfer id)CNCopyC

Android wifi属性简介 及 wifi信息获取(wifi列表、配置信息、热点信息)

Android wifi对象属性及简易Demo 本章介绍Android开发中WiFi热点和WiFi属性的获取,介绍WiFi的名称.状态等属性以及获取周围WiFi热点的方法. 一.怎样获取wifi对象并进行操作 要操作 WIFI 设备,需要先获取 Context.getSystemService(Context.WIFI_SERVICE)获取WifiManager对象,并通过这个对象来管理WIFI设备. addNetwork(WifiConfiguration config) 添加一个config