我遇到了一个问题,该问题早在2011年就在this tracker issue中报告,希望开发一种合适的解决方法。我想向用户显示所有Android设备的网络接口(interface),并按其类型以及当前是否处于 Activity 状态对其进行分类。我的目标至少是API 15。
据我所知,有两种获取网络接口(interface)信息的方法:
NetworkInterface
的内置Java NetworkInterface.getNetworkInterfaces()
类。这将返回NetworkInterface
对象,该对象包含诸如接口(interface)名称,与该接口(interface)关联的所有IP地址等信息。对于我的设备(LG G3),我获得诸如lo
,wlan0
和rmnet0
的接口(interface)。这还会返回我需要的信息,例如IP地址,MTU,子网掩码和广播地址。 ConnectivityManager
服务使用aConnManager.getAllNetworkInfo()
。这将为我的设备返回大约20个NetworkInfo
对象,大多数未使用,但它们包括MOBILE
,WIFI
,BLUETOOTH
等类型。这不包括任何网络参数,例如IP地址,MTU等。 跟踪器中解释的问题是,没有内置的方法可以将
NetworkInfo
映射到NetworkInterface
,反之亦然,并且我尽可能避免使用接口(interface)名称映射到适当的NetworkInfo
。由于我不可能直觉,因此对于大多数供应商而言,所有潜在的网络接口(interface)名称中是否都有列表?带有高通基带处理器的设备似乎很常见
rmnet[0-9]
,而带有WiFi的wlan[0-9]
似乎很常见。在最坏的情况下,如果接口(interface)名称与任何通用模板都不匹配,我想我可以将接口(interface)类型列为未知。提前致谢。
最佳答案
从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中引入的SO Q#33374766已在API 23中弃用了NetworkCapabilities),但自Android 6.0.1起,它却没有。 getAllNetworks()
不会列出所有网络(请参阅 TRANSPORT_CELLULAR
)。看起来像个虫子。或者,为了通知用户所有网络连接的状态,可以为ojit_a中可用的每种传输类型注册一组回调(即
TRANSPORT_WIFI
,TRANSPORT_ETHERNET
,TRANSPORT_BLUETOOTH
,TRANSPORT_VPN
和registerNetworkCallback
)使用ojit_a。
关于android - NetworkInfo和NetworkInterface之间的解决方法映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31358582/