Android 8.0 Oreo无法获取WiFi列表

7
在 Android 8.0 上,使用 wifiManager 无法获取 wifi 列表,在API级别低于26时可以获取列表。
此函数返回 WifiManager 对象。
public static WifiManager getWifiManager(Context context) {
        WifiManager wifiManager = null;
        try {

            wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

        } catch (NullPointerException e) {
            e.printStackTrace();
        }

        return wifiManager;
    }

此函数返回wifi列表

public static List<ScanResult> getWifiScanResults(Boolean sorted, Context context) {
    WifiManager wifiManager = NetworkUtil.getWifiManager(context);
    List<ScanResult> wifiList = wifiManager.getScanResults();

    //Remove results with empty ssid
    List<ScanResult> wifiListNew = new ArrayList<>();
    for (ScanResult scanResult : wifiList) {
        if (!scanResult.SSID.equals(""))
            wifiListNew.add(scanResult);
    }
    wifiList.clear();
    wifiList.addAll(wifiListNew);

         return wifiList;
}

我已经注册了 BroadcastReceiver

WiFiMainActivity.this.registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

以下是startScan()方法的代码:

   public static void startScan(Context context) {
        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        wifiManager.startScan();
    }

用户拥有以下权限:

  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

无法在Android 8.0 Oreo上跟踪错误,是否有其他权限我没有添加。


我有同样的问题。我正在开发一个应用程序,它使用WiFi扫描结果来工作。自从今天我使用了targetSdkVersion 25以来,在Android 8上一切都运行得很完美。今天我刚刚将targetSdkVersion更新到26,只是注意到在运行Android 8的设备上,不再接收扫描结果(通过在清单中声明的BroadcastReceiver)。只有将targetSdkVersion降级到25才能正常工作,但我需要一个targetSdkVersion 26或更高版本,所以现在我感到沮丧。网络上没有关于这个问题的信息。 - Marc Estrada
你能否使用targetSdkVersion 25测试你的代码,然后告诉我现在是否可以接收到wifi列表? - Marc Estrada
@MarcEstrada 你能解决这个问题吗?谢谢。 - user2867654
3个回答

7
自从在Android 8中引入了后台执行限制,大部分在Manifest中注册的BroadcastReceiver动作将不再被发送或接收,除了这些动作
是的,您正在通过您的Context进行注册,但也许您的代码是错误的。
您应该通过您的Application Context进行注册,而不是通过您的Activity Context以避免内存泄漏。此外,请尝试创建一个空的IntentFilter并之后添加您的动作。此代码在我的应用程序中与targetSdkVersion 26+和Android 8 Oreo(Nexus 5X)一起正常工作。
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.wifi.SCAN_RESULTS");
context.registerReceiver(new YourBroadcastReceiver(), intentFilter);

希望这有所帮助。

3
您的8.0安卓设备必须启用位置信息才能使用WiFi管理器。

是的,我正在尝试使用具有位置功能的Steel WiFi管理器,但它不起作用。 - Kumar Jadhav
1
即使启用了位置信息,针对26个以上的Wifi扫描结果的定位仍然无法正常工作。 - Marc Estrada

2

在运行时,您必须请求ACCESS_COARSE_LOCATION权限。

 @Override
    public void onResume(){
        super.onResume();
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            if(checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
                requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 0);
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接