NetworkInfo和NetworkInterface之间的变通方法映射

jpa*_*alm 42 android android-networking

我正面临2011年在跟踪器问题中报告的问题,并希望开发一个合适的解决方法.我想向用户显示所有Android设备的网络接口,并按类型分类,以及它们当前是否处于活动状态.我至少要针对API 15.

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

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

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

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

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

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

cui*_*uac 4

从 API 21 开始,您可以使用从对象中LinkProperties获取对象:NetworkInterfaceNetwork network

ConnectivityManager manager = getSystemService(ConnectivityManager.class);
LinkProperties prop = manager.getLinkProperties(network);    
NetworkInterface iface = NetworkInterface.getByName(prop.getInterfaceName());
Run Code Online (Sandbox Code Playgroud)

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

或者,为了通知用户所有网络连接的状态,可以使用 为NetworkCapability中可用的每种传输类型( TRANSPORT_CELLULAR, TRANSPORT_WIFI, TRANSPORT_ETHERNET, TRANSPORT_BLUETOOTH& TRANSPORT_VPN)注册一组回调registerNetworkCallback