Pregunta

El método java.net.InetAddress.GetByName (String host) solo puede devolver los registros de A para buscar otros tipos de registros que necesito para poder enviar consultas de DNS utilizando la biblioteca dnsjava .

Sin embargo, eso normalmente se basa en poder analizar /etc/resolv.conf o similar para encontrar las direcciones del servidor DNS y eso no funciona en Android.

La configuración actual de DNS en Android aparentemente solo se puede obtener desde un shell mediante el comando getprop .

¿Alguien puede decirme cómo obtener esa configuración de Java que no sea generar un shell con Runtime.exec () y analizar la salida de getprop ?

¿Fue útil?

Solución

El protocolo DNS no es tan complejo, ¿no puedes hacer el ¿Los accesos DNS utilizando sockets sin formato (TCP o UDP)? Después de un vistazo rápido a dnsjava doco, parece proporcionar un soporte de DNS de bajo nivel para ayudar con esto.

La otra dirección posible es, comenzando con dnsjava, eliminar la dependencia en /etc/resolv.conf . Pensaría en usar getprop en su script de inicio para establecer las propiedades en la JVM, o para crear un archivo resolv.conf localizado en el directorio de su aplicación, desde el cual puede leer la información necesaria. En otras palabras, use getprop para inyectar información en la JVM en lugar de intentar extraerla una vez que la JVM esté funcionando. Seguramente crear un archivo que dnsjava pueda usar directamente debería ser factible.


Editar - android.net

Parece que android.net.ConnectivityManager le proporcionará una gran variedad de NetworkInfo utilizando getAllNetworkInfo () . Luego use android.net.NetworkUtils.runDhcp () para obtener una DhcpInfo para cualquier interfaz de red dada: la estructura DhcpInfo tiene la dirección IP para dns1 y dns2 para esa interfaz. Sin embargo, me sorprende que los DNS sean int, lo que implica IP4 solamente.

Otros consejos

No creo que sea posible para el caso general. Para WiFi encontré esto:

WiFiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE); 
DhcpInfo info = wifi.getDhcpInfo(); 

Para obtener las propiedades del sistema de un sistema Android, los métodos estáticos en esta clase ( android.os.SystemProperties ) puede ser utilizado. Como no es una API abierta, no se puede compilar contra el SDK. Es necesario trabajar alrededor para hacer eso, por ejemplo. Copie el código de AOSP para obtener a través de la compilación. Como esta clase es para uso interno, hazlo bajo tu propio riesgo. Diviértete.

Deberíamos poder encontrar la dirección de DNS independientemente de la red (wifi o Ethernet) a la que estamos conectados. Aquí está mi programa.

En tu AndroidManifest.xml archivo

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Tu código:

    ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Service.CONNECTIVITY_SERVICE);

                /* you can print your active network via using below */
                Log.i("myNetworkType: ", connectivityManager.getActiveNetworkInfo().getTypeName());
                WifiManager wifiManager= (WifiManager) getApplicationContext().getSystemService(getApplicationContext().WIFI_SERVICE);


                Log.i("routes ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getRoutes().toString());
                Log.i("domains ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getDomains().toString());
                Log.i("ip address ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getLinkAddresses().toString());
                Log.i("dns address ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getDnsServers().toString());



                if(connectivityManager.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI) {
                    Log.i("myType ", "wifi");
                    DhcpInfo d =wifiManager.getDhcpInfo();
                    Log.i("info", d.toString()+"");
                }
                else if(connectivityManager.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_ETHERNET) {
/* there is no EthernetManager class, there is only WifiManager. so, I used this below trick to get my IP range, dns, gateway address etc */

                    Log.i("myType ", "Ethernet");
                    Log.i("routes ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getRoutes().toString());
                    Log.i("domains ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getDomains().toString());
                    Log.i("ip address ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getLinkAddresses().toString());
                    Log.i("dns address ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getDnsServers().toString());

                }
                else {

                }

Salida ingrese la descripción de la imagen aquí

No puede comunicarse para saber si está conectado a través de wifi o de la red utilizando WifiManager , ya que WifiManager solo trata con wifi. Tienes que usar ConnectivityManager . Actualicé el código nuevamente donde fusioné WifiManager y ConnectivityManager para producir el resultado que querías.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top