fast - http library android
Mapeo alternativo entre NetworkInfo y NetworkInterface (1)
Me enfrento a un problema que se informó en este problema de seguimiento en 2011 y me gustaría desarrollar una solución adecuada. Me gustaría mostrar todas las interfaces de red de un dispositivo Android al usuario, así como clasificarlas por su tipo y si están o no activas actualmente. Estoy apuntando a la API 15 como mínimo.
Que yo sepa, hay dos formas de obtener información de la interfaz de red:
A través de la clase incorporada Java
NetworkInterface
usandoNetworkInterface.getNetworkInterfaces()
. Esto devolverá los objetos deNetworkInterface
que contienen información como el nombre de la interfaz, todas las direcciones IP asociadas con la interfaz, etc. Para mi dispositivo (LG G3), obtengo interfaces comolo
,wlan0
yrmnet0
. Esto también devuelve información como la dirección IP, MTU, máscara de subred y dirección de transmisión, que necesito.A través del servicio de
aConnManager.getAllNetworkInfo()
ConnectivityManager
API de Android usandoaConnManager.getAllNetworkInfo()
. Esto devuelve alrededor de 20 objetosNetworkInfo
para mi dispositivo, la mayoría no están en uso, pero incluyen los tiposMOBILE
,WIFI
,BLUETOOTH
, etc. Esto no incluye ningún parámetro de red como direcciones IP, MTU, etc. como se mencionó anteriormente.
El problema que se explica en el rastreador es que no hay una forma integrada de asignar NetworkInfo
a un NetworkInterface
o viceversa, y me gustaría evitar el uso del nombre de la interfaz para asignarlo a la NetworkInfo
adecuada si es posible.
Ya que tengo una corazonada que no es posible, ¿hay una lista en algún lugar de todos los posibles nombres de interfaz de red para la mayoría de los proveedores? rmnet[0-9]
parece común para dispositivos con procesadores de banda base de Qualcomm, y wlan[0-9]
para WiFi, etc.
En el peor de los casos, supongo que podría indicar el tipo de interfaz como desconocido si el nombre de la interfaz no coincide con ninguna plantilla común. Gracias por adelantado.
Desde la API 21, puede usar LinkProperties
para obtener un objeto NetworkInterface
fuera de un objeto de network
:
ConnectivityManager manager = getSystemService(ConnectivityManager.class);
LinkProperties prop = manager.getLinkProperties(network);
NetworkInterface iface = NetworkInterface.getByName(prop.getInterfaceName());
Sin embargo, aunque se supone que getAllNetworkInfo()
reemplaza a getAllNetworkInfo()
(el primero, introducido en API 21, ha getAllNetworkInfo()
este último en API 23), como en Android 6.0.1, no lo hace. getAllNetworks()
no lista todas las redes (vea SO Q # 33374766 ). Parece un error.
Alternativamente, para informar al usuario sobre el estado de todas las conexiones de red, se puede registrar un conjunto de devoluciones de llamada para cada tipo de transporte disponible en NetworkCapabilities ( es decir , TRANSPORT_WIFI
, TRANSPORT_ETHERNET
, TRANSPORT_BLUETOOTH
, TRANSPORT_BLUETOOTH
& TRANSPORT_VPN
) usando registerNetworkCallback
.