【问题标题】:Workaround mapping between NetworkInfo and NetworkInterfaceNetworkInfo 和 NetworkInterface 之间的解决方法映射
【发布时间】:2015-07-11 15:11:56
【问题描述】:

我遇到了一个早在 2011 年就在 this tracker issue 中报告的问题,我想开发一个合适的解决方法。我想向用户显示所有 Android 设备的网络接口,并按它们的类型以及它们当前是否处于活动状态对它们进行分类。我的目标至少是 API 15。

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

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

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

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

由于我有一种不可能的预感,是否有一个列表列出了大多数供应商的所有潜在网络接口名称? rmnet[0-9] 似乎对于配备高通基带处理器的设备很常见,wlan[0-9] 对于 WiFi 等似乎很常见。

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

【问题讨论】:

    标签: android android-networking


    【解决方案1】:

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

    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)。看起来像一个错误。

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

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2011-02-07
      • 2021-06-15
      相关资源
      最近更新 更多