2015-07-11 115 views
41

我面临的问题是2011年在this tracker issue中报告并希望开发适当的解决方法。我想将所有Android设备的网络接口显示给用户,并按照其类型以及它们是否当前处于活动状态进行分类。我的目标是至少达到API 15。NetworkInfo和NetworkInterface之间的解决方法映射

据我所知,有两种方式获取网络接口信息:

  1. 通过使用NetworkInterface.getNetworkInterfaces()内置的Java类NetworkInterface。这将返回NetworkInterface对象,其中包含接口名称,与接口关联的所有IP地址等信息。对于我的设备(LG G3),我获得如lo,wlan0rmnet0的接口。这也会返回我需要的信息,如IP地址,MTU,子网掩码和广播地址。

  2. 通过Android API ConnectivityManager服务使用aConnManager.getAllNetworkInfo()。这为我的设备返回大约20个对象,大部分都未使用,但它们包括类型MOBILE,WIFI,BLUETOOTH等。这不包括如上所述的任何网络参数,如IP地址,MTU等。

在跟踪器解释的问题是,有没有内置的方式映射NetworkInfoNetworkInterface或反之亦然,我想避免使用接口名称映射到相应的NetworkInfo如果可能的话。

由于我有一种预感不可能,对于大多数供应商来说,有没有一个列出所有潜在网络接口名称的列表? rmnet[0-9]似乎与高通的基带处理器的设备普遍,wlan[0-9]支持WiFi等

在最坏的情况下,我想我可以列出接口类型为未知,如果接口名称不匹配任何公共模板。提前致谢。

回答

1

由于API 21,你可以用LinkProperties获得NetworkInterface对象了Networknetwork对象:

ConnectivityManager manager = getSystemService(ConnectivityManager.class); 
LinkProperties prop = manager.getLinkProperties(network);  
NetworkInterface iface = NetworkInterface.getByName(prop.getInterfaceName()); 

然而,尽管getAllNetworks()应该更换getAllNetworkInfo()(前者,在API 21推出,有在API 23中弃用了后者),但是从Android 6.0.1开始,它并没有。 getAllNetworks()不是列出所有网络(请参阅SO Q#33374766)。看起来像一个错误。

可替代地,为了通知用户有关的所有网络连接的状态,一组回调可以登记使用的每个传输可在NetworkCapabilities类型(TRANSPORT_CELLULARTRANSPORT_WIFITRANSPORT_ETHERNETTRANSPORT_BLUETOOTH & TRANSPORT_VPNregisterNetworkCallback