我想在微调器中显示可用的wifi网络的列表。但是在当前版本中,当范围内有许多wifi网络时,我会得到很多重复的网络和空白值。如何唯一标识每个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();
}
您可能还会看到属于
same网络的不同路由器。这些将是公司网络上的不同接入点,例如,为了提供最大的覆盖范围而进行了战略定位。
您可能还会看到合法重复的条目。
您有几种方法来处理这些问题,但是普遍接受的方法是通过BSSID进行重复数据删除,然后显示带有信号表的SSID列表。上面代码的问题是filter()
不能按您期望的方式工作。似乎您期望它过滤
out
ssid.equals("")
,而实际上filter()
会删除所有not符合条件的项目。您可以在Stream
documentation page上看到一个示例。
Stream
更改为.filter(ssid -> ssid.equals(""))