NetworkInfo和NetworkInterface之间的解决方法映射

我在2011年遇到了这个跟踪器问题中报告的问题,并希望开发一个适当的解决方法。 我想将所有Android设备的networking接口显示给用户,并按照他们的types以及他们是否当前处于活动状态进行分类。 我的目标是至less达到API 15。

据我所知,有两种获取networking接口信息的方法:

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

  2. 通过使用aConnManager.getAllNetworkInfo()的Android API ConnectivityManager服务。 这为我的设备返回大约20个NetworkInfo对象,大部分都是未使用的,但它们包括MOBILEWIFIBLUETOOTH等types。这不包括像上面提到的IP地址,MTU等任何networking参数。

跟踪器中解释的问题是没有内置的方法将NetworkInfo映射到NetworkInfo ,反之亦然,我想避免使用接口名称映射到适当的NetworkInfo如果可能的话)。

由于我有一种预感,这是不可能的,是否有列表中的大多数供应商的所有潜在的networking接口名称? 对于使用高通基带处理器的设备, rmnet[0-9]似乎很常见,WiFi等的wlan[0-9]等等。

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

从API 21开始,可以使用LinkPropertiesNetwork network对象中获取NetworkInterface对象:

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

然而,尽pipegetAllNetworks()应该取代getAllNetworkInfo() (前者在API 21中引入,后者在API 23中被弃用),但是从Android 6.0.1开始,它并没有。 getAllNetworks() 不会列出所有networking(参见SO Q#33374766 )。 看起来像一个错误。

或者,为了通知用户所有networking连接的状态,可以使用registerNetworkCallback针对NetworkCapabilities ( 即, TRANSPORT_CELLULARTRANSPORT_WIFITRANSPORT_ETHERNETTRANSPORT_BLUETOOTHTRANSPORT_VPN )中可用的每个传输types注册一组callback。