NetworkInfo和NetworkInterface之间的解决方法映射
我在2011年遇到了这个跟踪器问题中报告的问题,并希望开发一个适当的解决方法。 我想将所有Android设备的networking接口显示给用户,并按照他们的types以及他们是否当前处于活动状态进行分类。 我的目标是至less达到API 15。
据我所知,有两种获取networking接口信息的方法:
-
通过使用
NetworkInterface.getNetworkInterfaces()
的内置JavaNetworkInterface
类。 这将返回包含接口名称,与接口关联的所有IP地址等信息的NetworkInterface
对象。对于我的设备(LG G3),我获得了接口lo
,wlan0
和rmnet0
。 这也会返回我需要的信息,如IP地址,MTU,子网掩码和广播地址。 -
通过使用
aConnManager.getAllNetworkInfo()
的Android APIConnectivityManager
服务。 这为我的设备返回大约20个NetworkInfo
对象,大部分都是未使用的,但它们包括MOBILE
,WIFI
,BLUETOOTH
等types。这不包括像上面提到的IP地址,MTU等任何networking参数。
跟踪器中解释的问题是没有内置的方法将NetworkInfo
映射到NetworkInfo
,反之亦然,我想避免使用接口名称映射到适当的NetworkInfo
如果可能的话)。
由于我有一种预感,这是不可能的,是否有列表中的大多数供应商的所有潜在的networking接口名称? 对于使用高通基带处理器的设备, rmnet[0-9]
似乎很常见,WiFi等的wlan[0-9]
等等。
在最坏的情况下,我想我可以列出接口types为未知,如果接口名称不匹配任何常见的模板。 提前致谢。
从API 21开始,可以使用LinkProperties
从Network
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_CELLULAR
, TRANSPORT_WIFI
, TRANSPORT_ETHERNET
, TRANSPORT_BLUETOOTH
& TRANSPORT_VPN
)中可用的每个传输types注册一组callback。