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

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

  • 通过使用NetworkInterface的内置Java NetworkInterface.getNetworkInterfaces()类。这将返回NetworkInterface对象,该对象包含诸如接口(interface)名称,与该接口(interface)关联的所有IP地址等信息。对于我的设备(LG G3),我获得诸如lowlan0rmnet0的接口(interface)。这还会返回我需要的信息,例如IP地址,MTU,子网掩码和广播地址。
  • 通过Android API ConnectivityManager服务使用aConnManager.getAllNetworkInfo()。这将为我的设备返回大约20个NetworkInfo对象,大多数未使用,但它们包括MOBILEWIFIBLUETOOTH等类型。这不包括任何网络参数,例如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_WIFITRANSPORT_ETHERNETTRANSPORT_BLUETOOTHTRANSPORT_VPNregisterNetworkCallback)
    使用ojit_a。

    关于android - NetworkInfo和NetworkInterface之间的解决方法映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31358582/

    10-13 05:01