首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Android 8 Oreo中,在WifiManager的startscan方法中未收到响应

在Android 8 Oreo中,在WifiManager的startscan方法中未收到响应
EN

Stack Overflow用户
提问于 2018-05-21 18:43:57
回答 1查看 2.1K关注 0票数 5

根据安卓官方文档,WifiManager的方法startScan在API级别P中被弃用。然而,我正尝试在API级别26 (P之前的版本)中使用此方法,但没有成功。我已经开发了一个应用程序,它需要扫描WiFi网络,如果用户同意所需的权限,这一行为对于应用程序的适当功能至关重要。但是,在调用startScan方法时,我没有收到任何响应。有人能帮我解决这个问题或找到替代解决方案吗?

这是指向文档的链接。https://developer.android.com/reference/android/net/wifi/WifiManager.html#startScan()

干杯

编辑

这是启动de scannig进程的代码:

代码语言:javascript
运行
复制
public boolean startScan() {
   WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
   if (!wm.isWifiEnabled()) {
     try {
       wm.setWifiEnabled(true);
     } catch (SecurityException e) {
       Log.w(LOG_TAG, "Error enabling wifi", e);
       return false;
     }
   }
   boolean started = wm.startScan();
   Log.d(LOG_TAG, "Scan started? " + started);
   return started;
}

这是接收扫描结果的BroadcastReceiver。除了安装了targetSdkVersion 26+的安卓8以外,它都能正常工作

代码语言:javascript
运行
复制
public class InOutWifiScanResultsReceiver extends BroadcastReceiver {
   private static final String LOG_TAG = "ScanResults";

   @Override
   public void onReceive(Context context, Intent intent) {
     super.onReceive(context, intent); // Never called in Android 8 and targetSdkVersion 26+
     List<ScanResult> results = getWifiResults(context);
     Log.d(LOG_TAG, "Received results (" +  results.size() + " AP's)");
   }

   private static List<ScanResult> getWifiResults(Context context) {
      WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
      try {
        return wm.getScanResults();
      } catch (SecurityException e) {
        return new ArrayList<>();
      }
   }
}

在清单中,我们使用以下In permissins和声明的BroadcastReceiver:

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<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"/>

 <receiver
    android:name=".InOutWifiScanResultsReceiver"
    android:exported="false">
    <intent-filter>
        <action android:name="android.net.wifi.SCAN_RESULTS"/>
    </intent-filter>
 </receiver>

位置权限在运行时是必需的,所以我确信它是被允许的。我也确定位置是活动的(GPS级别)。

BroadcastReceiver工作得很好,因为在targetSdkVersion = 25或更低的情况下编译,every会按预期工作,并且会收到扫描结果。我也用android:exported="true“进行了测试,但它对结果没有影响。

如果能得到你的帮助,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-04 05:12:54

在Android8或更高版本中,由于性能原因,通过Manifest声明的隐式BroadcastReceivers不再被发送或接收(这是在Android 8中引入的一个优化,它限制了background execution)。有一些例外是列出的here,但android.net.wifi.SCAN_RESULTS动作不是一个例外,所以在安卓8+中,你不能注册一个android.net.wifi.SCAN_RESULTS动作来等待Manifest中的ScanResults (实际上你可以,但你什么也得不到)。

如果您的targetSdkVersion为26 (Android 8 Oreo)或更高,则会发生这种情况,但如果您在Gradle文件中声明targetSdkVersion为25或更低,此优化将不会在您的应用程序上运行,并且您通过Manifest注册的隐式Intents将按预期工作。

要让它在带有targetSdkVersion 26+的Android 8 Oreo中工作,你必须通过Application Context注册它。

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

但要注意,这种注册需要应用程序正在运行,所以当您的应用程序停止时,您将不会收到此BroadcastReceiver

附言:你的代码是正确的,但是你没有记住这个Android 8限制。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50447117

复制
相关文章

相似问题

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