Android wifimanager.startscan() 在主线程还是在后台?
Android wifimanager.startscan() in main thread or in background?
当我想获取可用的 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 网络,然后如果找到需要的网络,我将连接到它(到套接字)。这个过程像第一步一样在管道中使用。
很遗憾地通知您,但代码片段缺少很多元素(在效率方面)并且也不正确,让我详细说明一下:
- startScan() 仅从 OS 请求扫描,在某些情况下它不会立即启动扫描。所以你需要检查调用
中的return布尔值
- 在调用 startScan 之前,您应该为 WifiManager.SCAN_RESULTS_AVAILABLE_ACTION 注册一个 BroadcastReceiver,只有在那之后您才应该得到结果
- 您可能不需要多次启动扫描。一个相对较新的结果可能已经可用。您可以查看 ScanResult 的时间戳值 (API 17),以估计 "fresh" 扫描
- 你根本不检查设备是否有WIFI硬件
您只有在 Wifi 开启时才启动扫描,Android 设备(因为我认为 API 16)即使在 WIFI 关闭时也可以扫描网络
要检查您是否可以启动扫描,请使用此(在函数中 returns 布尔值):
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;
当我想获取可用的 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 网络,然后如果找到需要的网络,我将连接到它(到套接字)。这个过程像第一步一样在管道中使用。
很遗憾地通知您,但代码片段缺少很多元素(在效率方面)并且也不正确,让我详细说明一下:
- startScan() 仅从 OS 请求扫描,在某些情况下它不会立即启动扫描。所以你需要检查调用 中的return布尔值
- 在调用 startScan 之前,您应该为 WifiManager.SCAN_RESULTS_AVAILABLE_ACTION 注册一个 BroadcastReceiver,只有在那之后您才应该得到结果
- 您可能不需要多次启动扫描。一个相对较新的结果可能已经可用。您可以查看 ScanResult 的时间戳值 (API 17),以估计 "fresh" 扫描
- 你根本不检查设备是否有WIFI硬件
您只有在 Wifi 开启时才启动扫描,Android 设备(因为我认为 API 16)即使在 WIFI 关闭时也可以扫描网络 要检查您是否可以启动扫描,请使用此(在函数中 returns 布尔值):
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;