主线程或后台的Android wifimanager.startscan()?

时间:2015-02-19 12:17:20

标签: android android-wifi

当我想获得可用的wifi网络列表时,最好使用什么样的开始哲学? 我在主线程中这样做:

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:**下一步我的问题的本质:我想扫描可用的无线网络,然后如果需要网络,我就连接到它(到套接字)。这个过程在第一步的管道中使用。

1 个答案:

答案 0 :(得分:0)

我很抱歉地通知你,但代码片段有很多缺失的元素(效率方面),也是不正确的,让我详细说明一下:

  • startScan()仅从操作系统请求扫描,在某些情况下它不会立即启动扫描。所以你需要检查来自调用的返回布尔值
  • 在调用startScan之前,您应该为WifiManager.SCAN_RESULTS_AVAILABLE_ACTION注册一个BroadcastReceiver,并且只有在那之后才能获得结果
  • 您可能不需要进行大量扫描。可能已经有了一个相对新鲜的结果。您可以查看ScanResult的时间戳值(API 17)来估算&#34; fresh&#34;扫描
  • 您无需检查设备是否具有WIFI硬件
  • 如果启用Wifi,您只会启动扫描,即使WIFI关闭,Android设备(我认为自API 16)也可以扫描网络 要检查是否可以启动扫描,请使用此功能(在函数中返回boolean):

    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;