在Android 8 Oreo的WifiManager中,STARTcan方法没有收到任何响应

Ant*_*nio 5 android wifimanager android-8.0-oreo

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

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

干杯

编辑:

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

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;
}
Run Code Online (Sandbox Code Playgroud)

这是接收扫描结果的BroadcastReceiver.除了在带有targetSdkVersion 26+的Android 8中,它才有效

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<>();
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

在Manifest中,我们使用followint permissins和BroadcastReceiver声明:

<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>
Run Code Online (Sandbox Code Playgroud)

运行时需要位置权限,所以我确定它是允许的.我也确实位置有效(GPS级别).

BroadcastReceiver工作正常,因为使用targetSdkVersion = 25或更低版本进行编译时,每个按预期工作并接收扫描.我还测试了android:exported ="true",但它对结果没有影响.

我将感激你的帮助.

Mar*_*ada 5

在Android 8或更高版本中,由于性能原因,隐式BroadcastReceivers声明的via Manifest不再发送或接收(这是引入的优化,Android 8其中限制了后台执行).有这些列出了一些例外这里,但android.net.wifi.SCAN_RESULTS行动也不例外,所以在Android的8+你不能注册一个android.net.wifi.SCAN_RESULTS动作等待ScanResultsManifest(其实你可以,但你会得到什么).

如果你的targetSdkVersion是26(Android 8 Oreo或更高),则会发生这种情况,但如果你在Gradle文件中声明targetSdkVersion25或更低,那么这个优化将不会针对你的应用运行,你的隐式Intents注册Manifest将会按预期工作.

要让它Android 8 OreotargetSdkVersion26+ 一起工作,你必须通过你的注册Application Context.

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.wifi.SCAN_RESULTS");
context.registerReceiver(new InOutWifiScanResultsReceiver(), intentFilter);
Run Code Online (Sandbox Code Playgroud)

但请注意,此类注册需要应用程序正在运行,因此当您的应用程序停止时,您将无法收到此消息BroadcastReceiver.

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