此时我正在尝试构建一个能够在室内找到支持wifi的设备的Android应用程序。所以我按顺序分解了各个步骤,其中一个步骤是扫描可用的无线网络并返回与它发现的每个接入点相关的信号强度等(它不必连接到接入点但是只需要ping他们的信息)。下面显示了我创建的代码片段,当代码被调试时,它没有识别wifi接入点,所以有人可以告诉我问题出在哪里或指向正确的方向。
myWifiMan.startScan();
List<ScanResult> wifiList = myWifiMan.getScanResults();
if (wifiList != null) {
//Construct Clue
for(int i = 0; i < wifiList.size(); i++) {
message = message + "'" + wifiList.get(i).SSID +"':" + Integer.toString(wifiList.get(i).level);
if((i+1) < wifiList.size())
message = message + ",";
}
message = message + "}]";
由于下面给出的答案,以下代码会给出我想要的结果吗?
private void initializeWiFiListener(){
System.out.println("executing initializeWiFiListener");
String connectivity_context = Context.WIFI_SERVICE;
final WifiManager wifi = (WifiManager)getSystemService(connectivity_context);
if(!wifi.isWifiEnabled()){
if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING){
wifi.setWifiEnabled(true);
}
}
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
boolean a= wifiManager.startScan();//request a scan for access points
final List<ScanResult> results= wifiManager.getScanResults();//list of access points from the last scan
for(final ScanResult result : results){
System.out.println("ScanResult level: "+ result.level);
}
}
}, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
}
答案 0 :(得分:4)
这可能是因为startScan
方法只会触发附近接入点的发现,并且不会立即为您提供这些接入点。
Android文档说明了这个方法:
请求扫描接入点。立即返回。该 结果的可用性通过以下 来表示 完成扫描时发送异步事件。
因此,您必须向SCAN_RESULTS_AVAILABLE_ACTION
注册BroadcastReceiver
,以便在扫描完成后立即获取可用接入点的列表。
此时,您可以调用getScanResults()
方法,该方法将返回找到的访问点列表。
编辑:确保在启动扫描之前在设备上启用了Wi-Fi。
答案 1 :(得分:2)
对于getScanResults,官方的android documentation说 -
应用必须持有ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限才能获得有效结果。
我遇到了同样的问题。没有这些权限,我的代码在三星手机中工作,但在Nexus或Motorola中没有。启用这些权限后,它会提供更合适的结果并适用于所有手机。