Обходное сопоставление между NetworkInfo и NetworkInterface

Я столкнулся с проблемой, о которой сообщалось в этой проблеме трекера еще в 2011 году, и хотел бы разработать подходящее решение. Я хотел бы показать все сетевые интерфейсы устройства Android для пользователя, а также классифицировать их по их типу и независимо от того, активны они или нет. Я нацелен на API 15 как минимум.

Насколько мне известно, есть два способа получить информацию о сетевом интерфейсе:

  1. Через встроенный класс Java NetworkInterface используя NetworkInterface.getNetworkInterfaces() . Это вернет объекты NetworkInterface , содержащие информацию, такую ​​как имя интерфейса, все IP-адреса, связанные с интерфейсом, и т. Д. Для моего устройства (LG G3) я получаю такие интерфейсы, как lo , wlan0 и rmnet0 . Это также возвращает информацию, такую ​​как IP-адрес, MTU, маску подсети и широковещательный адрес, который мне нужен.

  2. Через службу Android API ConnectivityManager с помощью aConnManager.getAllNetworkInfo() . Это возвращает около 20 объектов NetworkInfo для моего устройства, большинство из них не используются, но они включают типы MOBILE , WIFI , BLUETOOTH и т. Д. Это не включает в себя такие параметры сети, как IP-адреса, MTU и т. Д., Как указано выше.

Проблема, объясняемая в трекере, заключается в том, что нет встроенного способа сопоставления NetworkInfo с NetworkInterface или наоборот, и я хотел бы избежать использования имени интерфейса для сопоставления с соответствующим NetworkInfo если это вообще возможно.

Поскольку у меня есть догадка, что это невозможно, есть ли список большинства потенциальных имен сетевых интерфейсов для большинства поставщиков? rmnet[0-9] кажется обычным для устройств с процессорами baseband Qualcomm и wlan[0-9] для WiFi и т. Д.

В худшем случае я предполагаю, что я мог бы указать тип интерфейса как неизвестный, если имя интерфейса не соответствует общим шаблонам. Заранее спасибо.

Solutions Collecting From Web of "Обходное сопоставление между NetworkInfo и NetworkInterface"

Начиная с 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 ). Похож на ошибку.

В качестве альтернативы, чтобы информировать пользователя о состоянии всех сетевых подключений, для каждого типа транспорта, доступного в NetworkCapabilities ( т. Е. TRANSPORT_CELLULAR , TRANSPORT_WIFI , TRANSPORT_ETHERNET , TRANSPORT_BLUETOOTH & TRANSPORT_VPN ), может быть зарегистрирован набор обратных вызовов с использованием registerNetworkCallback .