Android wifimanager.startscan() 在主线程还是在后台?

Posted

技术标签:

【中文标题】Android wifimanager.startscan() 在主线程还是在后台?【英文标题】:Android wifimanager.startscan() in main thread or in background? 【发布时间】:2015-02-19 12:17:19 【问题描述】:

当我想获取可用 wifi 网络列表时,最好使用 startscan 的哪种理念? 我在主线程中这样做:

List<ScanResult> wifiList;
wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
if (!wifiManager.isWifiEnabled()) wifiManager.setWifiEnabled(true);
wifiManager.startScan();
wifiList = wifiManager.getScanResults();
for (int i = 0; i < wifiList.size(); i++) 
    String[] networkInfo = wifiList.get(i).toString().split(",");
    if (networkInfo[0].trim().equals(AP_SEARCH_SSID))
        petcub_networks++;

在我用于测试的所有设备中,它都可以正常工作,除了少数三星智能手机。它发生在客户设备上,我无法快速调试它。 有人和三星有同样的问题吗?或者会更好地在后台扫描AP?能解决我的问题吗?

**UPD:**接下来我的问题的本质:我想扫描可用的 wifi 网络,然后如果找到需要的网络,我将连接到它(到套接字)。此过程在管道中使用,如第一步。

【问题讨论】:

究竟是什么问题?您绝对应该为WifiManager.SCAN_RESULTS_AVAILABLE_ACTION 注册一个接收器,而不是立即调用getScanResults() 你的意思是在广播接收器中使用这个功能? 检查我的答案,它从多个角度解决了这个问题 实际上我的要求的问题更直接。三星设备总是返回空的 ssid 名称。 【参考方案1】:

很抱歉通知您,但代码 sn-ps 有很多缺失的元素(就效率而言)并且也不正确,让我详细说明一下:

startScan() 仅向操作系统请求扫描,在某些情况下它不会立即启动扫描。所以你需要检查调用的返回布尔值 在调用 startScan 之前,您应该为 WifiManager.SCAN_RESULTS_AVAILABLE_ACTION 注册一个 BroadcastReceiver,并且只有在此之后,您才能获得结果 您可能不需要多次启动扫描。可能已经有了一个相对新鲜的结果。您可以查看 ScanResult 的时间戳值 (API 17) 来估计扫描的“新鲜程度” 你根本没有检查设备是否有WIFI硬件

只有在 Wifi 开启时才启动扫描,即使 WIFI 关闭,android 设备(我认为是 API 16 起)也可以扫描网络 要检查您是否可以启动扫描,请使用此(在函数中返回布尔值):

if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) 
    return false;

WifiManager mWifiManager = (WifiManager) context
        .getSystemService(Context.WIFI_SERVICE);


boolean ret = mWifiManager.isWifiEnabled();
ret = ret || ((android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) &&
        mWifiManager.isScanAlwaysAvailable());
return ret;

【讨论】:

我最少使用 14 个 sdk。我正在检查wifi是否可用。但最感兴趣的是:我只在三星上有这个问题。 WTF???这太奇怪了 确实,我同意ceran

以上是关于Android wifimanager.startscan() 在主线程还是在后台?的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录