Asignación de soluciones entre NetworkInfo y NetworkInterface
Estoy afrontando un problema que se informó en este tema del rastreador 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. Tengo como objetivo API 15 como mínimo.
Por lo que sé, hay dos maneras de obtener información de la interfaz de red:
- Ejecución de WebView en segundo plano
- Android Buscar la dirección IP del dispositivo cuando está alojando un hotspot
- ¿Cuál es la forma correcta de iniciar una comunicación de red basada en recibir una intención de difusión?
- HttpUrlConnection de Android: Publicar Multipart
- ¿Cómo desactivo explícitamente el modo de flujo en bloque para las conexiones HTTP en Android?
-
A través de la clase Java
NetworkInterface
integrada que utilizaNetworkInterface.getNetworkInterfaces()
. Esto devolverá los objetosNetworkInterface
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 difusión, que necesito. -
Mediante el servicio
ConnectivityManager
API de Android utilizandoaConnManager.getAllNetworkInfo()
. Esto devuelve alrededor de 20 objetosNetworkInfo
para mi dispositivo, la mayoría están sin usar, pero incluyen tiposMOBILE
,WIFI
,BLUETOOTH
, etc. Esto no incluye ningún parámetro de red como direcciones IP, MTU, etc., como se mencionó anteriormente.
El problema explicado en el rastreador es que no hay una forma integrada de mapear el NetworkInfo
a un NetworkInterface
o viceversa, y me gustaría evitar usar el nombre de la interfaz para mapear al NetworkInfo
apropiado si es posible.
Dado que tengo un presentimiento que no es posible, ¿hay una lista en alguna parte de todos los nombres de interfaz de red potenciales para la mayoría de los vendedores? rmnet[0-9]
parece común para los dispositivos con procesadores de banda base Qualcomm, y wlan[0-9]
para WiFi, etc.
En el peor de los casos supongo que podría enumerar el tipo de interfaz como desconocido si el nombre de la interfaz no coincide con ninguna plantilla común. Gracias por adelantado.
- Cómo determinar si el tipo de red es 2G, 3G o 4G
- ¿Cómo puedo obtener el nombre de host o el nombre de dispositivo de dispositivos conectados a mi LAN a través de android?
- ¿Puede Wi-Fi o la CPU ir a dormir cuando la pantalla está encendida?
- Android desconocidoHostException Facebook SDK
- Ejemplo: socket de red bidireccional de Android utilizando AsyncTask
- ¿Cómo obtengo IP_ADDRESS en formato IPV4?
- Cambiar el modo de red móvil (gsm, wcdma, auto)
- Comportamiento de aplicaciones Android VOIP en modo Doze
Desde API 21, puede utilizar LinkProperties
para obtener un objeto NetworkInterface
fuera de un objeto de Network
network
:
ConnectivityManager manager = getSystemService(ConnectivityManager.class); LinkProperties prop = manager.getLinkProperties(network); NetworkInterface iface = NetworkInterface.getByName(prop.getInterfaceName());
Sin embargo, aunque getAllNetworks()
se supone que reemplazar getAllNetworkInfo()
(el primero, introducido en la API 21, ha desaprobado este último en API 23), a partir de Android 6.0.1, no lo hace. getAllNetworks()
no lista todas las redes (véase SO Q # 33374766 ). Parece un bicho.
Alternativamente, con el fin de informar al usuario sobre el estado de todas las conexiones de red, puede registrarse un conjunto de devoluciones de llamada para cada tipo de transporte disponible en NetworkCapabilities ( es decir TRANSPORT_CELLULAR
, TRANSPORT_WIFI
, TRANSPORT_ETHERNET
, TRANSPORT_BLUETOOTH
& TRANSPORT_VPN
) usando registerNetworkCallback
.
- "Aapt.exe" salió con el código 1 al crear el proyecto Mono para Android
- Versión de lanzamiento de Android y "Esperando depurador"