首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android 8.0 Oreo wifi列表未获取

Android 8.0 Oreo wifi列表未获取
EN

Stack Overflow用户
提问于 2018-03-08 18:44:26
回答 3查看 2.8K关注 0票数 7

Android 8.0上,无法使用wifiManager获取wifi列表,在API26级以下,我正在获取列表。

此函数返回 WifiManager Object

代码语言:javascript
复制
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列表

代码语言:javascript
复制
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

代码语言:javascript
复制
WiFiMainActivity.this.registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

,这里是startScan()方法

代码语言:javascript
复制
   public static void startScan(Context context) {
        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        wifiManager.startScan();
    }

具有以下权限的用户

代码语言:javascript
复制
  <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上的错误,是否有任何其他权限,我错过了。

EN

回答 3

Stack Overflow用户

发布于 2018-06-04 05:22:02

由于在Android 8中引入了background execution limitation,因此除了these ones之外,在Manifest中注册的大多数BroadcastReceiver操作将不再被发送或接收。

是的,您正在通过您的Context注册它,但可能您的代码是错误的。

您应该通过您的Application Context而不是您的Activity Context注册它,以避免内存泄漏。另外,尝试创建一个空的IntentFilter,然后添加您的操作。这段代码在我的应用程序中与Android 8 Oreo (Nexus5X)中的targetSdkVersion 26+一起工作得很好。

代码语言:javascript
复制
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.wifi.SCAN_RESULTS");
context.registerReceiver(new YourBroadcastReceiver(), intentFilter);

希望这能有所帮助。

票数 7
EN

Stack Overflow用户

发布于 2018-03-26 11:20:29

您的8.0 android设备必须启用定位功能,wifimanager才能正常工作。

票数 3
EN

Stack Overflow用户

发布于 2019-12-17 21:08:37

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

代码语言:javascript
复制
 @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);
            }
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49171173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档