美高梅平台下载-美高梅娱乐平台登录

热门关键词: 美高梅平台下载,美高梅娱乐平台登录

去看了下Android,可以获取到完整的WiFi列表

日期:2019-09-30编辑作者:美高梅平台下载

在Android 6.0调用getScanResults返回空列表,很多朋友都遇到过,解决方法也都有说明,就不再重复了,下面是官方的说明:

Android 6.0发布近一年之后,我们遇到了第一个Android 6.0的兼容性问题,getScanResults在Android6.0上返回了一个空列表,纳尼,你是在逗我么?去看了下Android 6.0某个分支下的getScanResult源码:

1、获取WiFi列表为空

部分手机使用以下代码获取WiFi列表,结果为空;

       // 得到扫描wifi列表结果
        mWifiList = mWifiManager.getScanResults();

而打开手机的GPS之后,可以获取到完整的WiFi列表。

图片 1getScanResults.png

 public List<ScanResult> getScanResults(String callingPackage) {

 enforceAccessPermission();

 int userId = UserHandle.getCallingUserId();

 int uid = Binder.getCallingUid();

 boolean canReadPeerMacAddresses = checkPeersMacAddress();

 boolean isActiveNetworkScorer =

 NetworkScorerAppManager.isCallerActiveScorer(mContext, uid);

 boolean hasInteractUsersFull = checkInteractAcrossUsersFull();

 long ident = Binder.clearCallingIdentity();

 try {

 if (!canReadPeerMacAddresses && !isActiveNetworkScorer

 && !isLocationEnabled()) {

 return new ArrayList<ScanResult>();

 }

 if (!canReadPeerMacAddresses && !isActiveNetworkScorer

 && !checkCallerCanAccessScanResults(callingPackage, uid)) {

 return new ArrayList<ScanResult>();

 }

 if (mAppOps.noteOp(AppOpsManager.OP_WIFI_SCAN, uid, callingPackage)

 != AppOpsManager.MODE_ALLOWED) {

 return new ArrayList<ScanResult>();

 }

 if (!isCurrentProfile(userId) && !hasInteractUsersFull) {

 return new ArrayList<ScanResult>();

 }

 return mWifiStateMachine.syncGetScanResultsList();

 } finally {

 Binder.restoreCallingIdentity(ident);

 }

 }

 private boolean isLocationEnabled() {

 return Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.LOCATION_MODE,

 Settings.Secure.LOCATION_MODE_OFF) != Settings.Secure.LOCATION_MODE_OFF;

 }
原因如下:

Android6.0(API level 23)在系统和API上都有着诸多的改变,为了更好的保护用户的数据,Android移除了从代码中通过Wi-Fi和蓝牙的API访问设备本地网络标识符。因此WifiInfo.getMacAddress()和BluetoothAdapter.getAddress()将始终返回02:00:00:00:00:00
而为了能够通过Wi-Fi和蓝牙扫描时,获取周边设备的硬件标识符,应用必须具有ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION权限:
WifiManager.getScanResults()
BluetoothDevice.ACTION_FOUND
BluetoothLeScanner.startScan()
更多相关内容可【点击这里】查看!

重点在:

2、使用WiFi名称字符串连接失败

目前网上的写法都是config.SSID = """ + SSID + """;这种价双引号的,在华为Mate 9上是连接失败; 而去掉双引号的写法可以连接成功,而且测试另外三星s7 Edge也是可以的,如下:

        WifiConfiguration config = new WifiConfiguration();
        config.allowedAuthAlgorithms.clear();
        config.allowedGroupCiphers.clear();
        config.allowedKeyManagement.clear();
        config.allowedPairwiseCiphers.clear();
        config.allowedProtocols.clear();
        config.SSID = SSID;//""" + SSID + """;加双引号的就是不行

但事情并没有结束,最近发现Android7.0也会返回空列表,e~难道修改方法不适用7.0,其实这个问题原因在于没打开GPS定位,具体可参见

if (!canReadPeerMacAddresses && !isActiveNetworkScorer

 && !isLocationEnabled()) {

 return new ArrayList<ScanResult>();

 }
目前原因尚不明确,所以先记录下来!

本文由美高梅平台下载发布于美高梅平台下载,转载请注明出处:去看了下Android,可以获取到完整的WiFi列表

关键词:

实现方法,真正调用的构造

参考:Android中定时器的3种实现方法 在Android开发中,定时器一般有以下3种实现方法: 总结 Handler类的主要作用是发送...

详细>>