gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:34:53 28 4
gpt4 key购买 nike

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

这是文档的链接。 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;
}

这是接收扫描结果的BroadcastReceiver。它适用于 Android 8 和 targetSdkVersion 26+

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

在 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>

运行时需要位置权限,所以我确定它是允许的。我也确信位置处于 Activity 状态(GPS 级别)。

BroadcastReceiver 工作正常,因为使用 targetSdkVersion = 25 或更少进行编译时,每次都按预期工作并收到扫描。我也用 android:exported="true"进行了测试,但它对结果没有影响。

我会感谢你的帮助。

最佳答案

在 Android 8 或更高版本中,由于性能原因,不再发送或接收通过 Manifest 声明的隐式 BroadcastReceivers(这是 Android 8 中引入的优化 限制了 background execution )。列出了一些异常(exception)情况 here ,但 android.net.wifi.SCAN_RESULTS 操作也不异常(exception),因此在 Android 8+ 中,您无法注册 android.net.wifi.SCAN_RESULTS 操作等待 Manifest 中的 ScanResults(实际上您可以,但您什么也得不到)。

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

要让它在 Android 8 Oreo 中使用 targetSdkVersion 26+,你必须通过你的 Application Context 注册它。

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

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

P.S:您的代码是正确的,但您没有记住这个 Android 8 限制。

关于android - 在 Android 8 Oreo 的 WifiManager 的 startscan 方法中没有收到响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50447117/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com