我正面临2011年this tracker issue报道的问题,并希望制定合适的解决方法。我想向用户显示所有Android设备的网络接口,并按类型分类,以及它们当前是否处于活动状态。我至少以API 15为目标。
据我所知,有两种获取网络接口信息的方法:
使用NetworkInterface
通过内置的Java NetworkInterface.getNetworkInterfaces()
类。这将返回包含接口名称,与接口关联的所有IP地址等信息的NetworkInterface
个对象。对于我的设备(LG G3),我获得了lo
,wlan0
等接口和rmnet0
。这也会返回我需要的IP地址,MTU,子网掩码和广播地址等信息。
使用ConnectivityManager
通过Android API aConnManager.getAllNetworkInfo()
服务。这会为我的设备返回大约20个NetworkInfo
个对象,大多数都未使用,但它们包括MOBILE
,WIFI
,BLUETOOTH
等类型。这不包括任何网络参数如上所述的IP地址,MTU等。
跟踪器中解释的问题是没有内置的方法将NetworkInfo
映射到NetworkInterface
,反之亦然,我想避免使用接口名称来映射如果可能的话,到适当的NetworkInfo
。
由于我预感不可能,大多数供应商的所有潜在网络接口名称中都有一个列表吗? rmnet[0-9]
对于使用Qualcomm基带处理器的设备而言似乎很常见,wlan[0-9]
用于WiFi等等。
在最坏的情况下,如果接口名称与任何常见模板不匹配,我想我可以将接口类型列为未知。提前谢谢。
答案 0 :(得分:3)
自API 21起,您可以使用LinkProperties
从NetworkInterface
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_CELLULAR
,TRANSPORT_WIFI
,TRANSPORT_ETHERNET
& TRANSPORT_BLUETOOTH
)
使用registerNetworkCallback
。