唯一过滤 wifi 网络名称
Filter wifi network names uniquely
我想在微调器中显示可用的 wifi 网络列表。但是对于当前版本,当该范围内有许多 wifi 网络时,我会得到很多重复的网络和白色 space 值。如何唯一标识每个 wifi 网络名称?我尝试了各种方法,仍然无法正确获取。在这方面的任何帮助将不胜感激。我当前为 android 24 之后制作的代码是:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
List<ScanResult> wifiList = wifiManager.getScanResults();
ssids = wifiList.stream()
.map(scanResult -> scanResult.SSID)
.filter(ssid -> ssid.equals(""))
.distinct()
.collect(Collectors.toList());
deviceList = new String[ssids.size()];
for (int i = 0; i < ssids.size(); i++) {
deviceList[i] = ((ssids.get(i)));
if(SCAN_RESULTS_AVAILABLE_ACTION.equals(true)){
wifiManager.disconnect();
}
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(context,
android.R.layout.simple_spinner_item, deviceList) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
if (position == getCount()) {
((TextView)v.findViewById(android.R.id.text1)).setText("");
((TextView)v.findViewById(android.R.id.text1)).setHint(getItem(getCount()));
//"Hint to be displayed"
}
return v;
}
@Override
public int getCount() {
return super.getCount()-1; // you don't display last item. It is used as hint.
}
};
adapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
wifiDeviceList.setAdapter(adapter);
wifiDeviceList.setSelection(adapter.getCount());//set the hint the default selection so it appears on launch.
wifiDeviceList.setOnItemSelectedListener(this);
adapter.notifyDataSetChanged();
}
如果您看到相同的 SSID,可能是因为 BSSID 不同。
您可能会看到属于不同网络但恰好具有相同名称的不同路由器(例如 "netgear" 或 "dlink")。这在密集的住宅区很常见。
您可能还会看到属于同一 网络的不同路由器。这些将是公司网络上的不同接入点,例如,战略性地放置以提供最大覆盖范围。
您可能还会看到合法的重复条目。
对于如何处理这些问题,您有多种选择,但普遍接受的方法是通过 BSSID 进行重复数据删除,然后显示带有信号表的 SSID 列表。
上面代码的问题是 filter()
没有按照您期望的方式工作。您似乎希望它过滤 out ssid.equals("")
,而实际上 filter()
会删除任何 not[=36] 的项目=] 符合条件。
您可以在 Stream
documentation page 上看到这方面的示例。
您想将 .filter(ssid -> ssid.equals(""))
更改为
.filter(ssid -> !ssid.equals(""))
我想在微调器中显示可用的 wifi 网络列表。但是对于当前版本,当该范围内有许多 wifi 网络时,我会得到很多重复的网络和白色 space 值。如何唯一标识每个 wifi 网络名称?我尝试了各种方法,仍然无法正确获取。在这方面的任何帮助将不胜感激。我当前为 android 24 之后制作的代码是:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
List<ScanResult> wifiList = wifiManager.getScanResults();
ssids = wifiList.stream()
.map(scanResult -> scanResult.SSID)
.filter(ssid -> ssid.equals(""))
.distinct()
.collect(Collectors.toList());
deviceList = new String[ssids.size()];
for (int i = 0; i < ssids.size(); i++) {
deviceList[i] = ((ssids.get(i)));
if(SCAN_RESULTS_AVAILABLE_ACTION.equals(true)){
wifiManager.disconnect();
}
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(context,
android.R.layout.simple_spinner_item, deviceList) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
if (position == getCount()) {
((TextView)v.findViewById(android.R.id.text1)).setText("");
((TextView)v.findViewById(android.R.id.text1)).setHint(getItem(getCount()));
//"Hint to be displayed"
}
return v;
}
@Override
public int getCount() {
return super.getCount()-1; // you don't display last item. It is used as hint.
}
};
adapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
wifiDeviceList.setAdapter(adapter);
wifiDeviceList.setSelection(adapter.getCount());//set the hint the default selection so it appears on launch.
wifiDeviceList.setOnItemSelectedListener(this);
adapter.notifyDataSetChanged();
}
如果您看到相同的 SSID,可能是因为 BSSID 不同。
您可能会看到属于不同网络但恰好具有相同名称的不同路由器(例如 "netgear" 或 "dlink")。这在密集的住宅区很常见。
您可能还会看到属于同一 网络的不同路由器。这些将是公司网络上的不同接入点,例如,战略性地放置以提供最大覆盖范围。
您可能还会看到合法的重复条目。
对于如何处理这些问题,您有多种选择,但普遍接受的方法是通过 BSSID 进行重复数据删除,然后显示带有信号表的 SSID 列表。
上面代码的问题是 filter()
没有按照您期望的方式工作。您似乎希望它过滤 out ssid.equals("")
,而实际上 filter()
会删除任何 not[=36] 的项目=] 符合条件。
您可以在 Stream
documentation page 上看到这方面的示例。
您想将 .filter(ssid -> ssid.equals(""))
更改为
.filter(ssid -> !ssid.equals(""))