解决NetworkInfo和NetworkInterface之间的映射问题

43

我面临的问题是2011年在这个问题跟踪器中报告的,并希望开发出一个合适的解决方法。我想向用户显示所有Android设备的网络接口,以及按其类型和是否当前处于活动状态进行分类。我的最低目标API为15。

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

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

  2. 通过Android API ConnectivityManager服务使用aConnManager.getAllNetworkInfo()。这为我的设备返回约20个NetworkInfo对象,其中大多数未被使用,但它们包括类型MOBILEWIFIBLUETOOTH等。这不包括任何网络参数,如上述IP地址、MTU等。

如跟踪器中所解释的那样,问题在于没有内置的方法将NetworkInfo映射到NetworkInterface或反之。我希望尽可能避免使用接口名称来映射到适当的NetworkInfo

由于我有一种直觉认为这是不可能的,是否有一个列出大多数厂商潜在网络接口名称的列表?对于具有高通基带处理器的设备,rmnet[0-9]似乎是常见的,对于WiFi,则是wlan[0-9]等。

最差的情况下,如果接口名称不符合任何常见模板,我想我可以将接口类型列为未知。提前致谢。

1个回答

4
自 API 21 开始,您可以使用 LinkProperties 来获取从 Network 对象中获取 NetworkInterface 对象的信息:network
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)。看起来像是一个bug。
或者,为了通知用户所有网络连接的状态,可以为NetworkCapabilities中的每种传输类型(即TRANSPORT_CELLULARTRANSPORT_WIFITRANSPORT_ETHERNETTRANSPORT_BLUETOOTHTRANSPORT_VPN)注册一组回调,使用registerNetworkCallback

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接