NetworkInfo和NetworkInterface

时间:2015-07-11 15:11:56

标签: android android-networking

我正面临2011年this tracker issue报道的问题,并希望制定合适的解决方法。我想向用户显示所有Android设备的网络接口,并按类型分类,以及它们当前是否处于活动状态。我至少以API 15为目标。

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

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

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

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

    由于我预感不可能,大多数供应商的所有潜在网络接口名称中都有一个列表吗? rmnet[0-9]对于使用Qualcomm基带处理器的设备而言似乎很常见,wlan[0-9]用于WiFi等等。

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

1 个答案:

答案 0 :(得分:3)

自API 21起,您可以使用LinkPropertiesNetworkInterface network对象中获取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中可用的每种传输类型注册一组回调( {{1} },TRANSPORT_CELLULARTRANSPORT_WIFITRANSPORT_ETHERNET& TRANSPORT_BLUETOOTH) 使用registerNetworkCallback