当前位置: 首页 > 知识库问答 >
问题:

Android 8 Oreo中WifiManager的startscan方法中没有收到响应

姜松
2023-03-14

这是文档的链接。https://developer.android.com/reference/android/net/wifi/wifiManager.html#startscan()

干杯

编辑:

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;
}
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<>();
      }
   }
}
<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>

BroadcastReceiver工作良好,因为使用targetSdkVersion=25或更低的版本进行编译时,每个都能按预期工作,并且收到扫描。我也用Android:exported=“true”进行了测试,但对结果没有影响。

我将感激你的帮助。

共有1个答案

锺威
2023-03-14

在Android8或更高版本中,由于性能原因,通过manifest声明的隐式broadcastreceivers不再发送或接收(这是在Android8中引入的优化,限制了后台执行)。这里列出了一些例外情况,但Android.net.wifi.scan_results操作不是例外情况,因此在Android 8+中,您不能注册Android.net.wifi.scan_results操作以在清单中等待scanresults(实际上您可以,但您将一无所获)。

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

要在Android 8 Oreo中使用TargetSDKVersion26+,您必须通过应用程序上下文注册它。

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.wifi.SCAN_RESULTS");
context.registerReceiver(new InOutWifiScanResultsReceiver(), intentFilter);

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

附注:您的代码是正确的,但是您没有记住这个Android8限制。

 类似资料:
  • 问题内容: 如何每隔3秒从wifi获取扫描结果,例如 Google说: 请注意,我在不调用的情况下使用此API级别 ,该列表包含wifi AP,但更新速度非常慢 更新至2019年1月12日:https : //issuetracker.google.com/issues/112688545 问题答案: Google现在已经记录了Android P中startScan()函数的限制: “我们进一步限

  • 下面是关于如何设置messenger机器人的Facebook教程-使用ngrok设置我的webhook。本地测试一切顺利,但在向bot发送消息时仍然没有收到任何响应。 韩国https://ngrok.com/ facebook教程https://developers.facebook.com/docs/messenger-platform/getting-started/quick-start/

  • 我正在使用Volley向API发出GET请求: 预期的JSON对象响应很大(可能高达500 KB)。我无法在日志中看到完整的响应。仅显示前50行左右。我还得到了info: BasicNetwork.log慢速请求:请求的HTTP响应= 这意味着请求需要超过3000毫秒。 尝试过的事情: 我已经在手机的开发者选项中将记录器缓冲区大小增加到1M。 原因可能是什么?当它很大的时候,响应是大块发送的吗?如

  • 我使用Jmeter对一个包括web套接字连接的应用程序进行负载测试。 当尝试使用单读取采样器读取帧中的数据时,得到错误响应代码:无响应响应消息:读取超时,未收到响应。 有人能帮我解决这个问题吗? 线程名称:密苏里州TestEnv 1-1样例开始时间:2019-10-09 10:40:43 IST加载时间:1000连接时间:0延迟时间:0大小以字节为单位:0发送字节:0头大小以字节为单位:0主体大小

  • 具有依赖项的Maven/Java项目: 代码: 公共类bmp_Selenium{ } 控制台输出: BrowserMob代理运行在端口:57547上启动chrome driver 2 . 33 . 506106(8 a 06 c 39 c 4582 fbfbfbab 6966 db B1 c 38 a 9173 BF B1 a 2)在端口47157上只允许本地连接。2017年11月30日下午4:4

  • 问题内容: 我编写了一个简单的类来测试响应读取实体方法(如果它按我的预期工作)。但是效果不佳。 当我启动课程时,出现以下错误: supported on an outbound message. at org.glassfish.jersey.message.internal.OutboundJaxrsResponse.readEntity(OutboundJaxrsResponse.java:1