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:

  1. A través de la clase Java NetworkInterface integrada que utiliza NetworkInterface.getNetworkInterfaces() . Esto devolverá los objetos NetworkInterface 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 como lo , wlan0 y rmnet0 . Esto también devuelve información como la dirección IP, MTU, máscara de subred y dirección de difusión, que necesito.

  2. Mediante el servicio ConnectivityManager API de Android utilizando aConnManager.getAllNetworkInfo() . Esto devuelve alrededor de 20 objetos NetworkInfo para mi dispositivo, la mayoría están sin usar, pero incluyen tipos MOBILE , 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.

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 .

  • Android comprobar la conexión a Internet
  • Google Cloud Messaging: los mensajes no se reciben a veces hasta que se cambia el estado de la red
  • Retrofit 2.x: Cabecera de registro para la solicitud y la respuesta
  • Tiempo de espera predeterminado de Android MediaPlayer
  • Unidad que prueba una respuesta de red. Funciona al depurar, no cuando se ejecuta realmente
  • Dirección de difusión de Android
  • ¿Por qué URLConnection tiempo de espera después de 6 + minutos en lugar de 5 segundos?
  • Eventos enviados por el servidor en Android
  • Android: Actualizar el widget en la disponibilidad de la conexión de red
  • Android 2.2 MediaPlayer alternativa para HTTPS y transmisión en directo
  • ¿Cómo muestra Starbucks una interfaz de usuario en dispositivos Android cuando está cerca de la tienda?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.