android - datos - dns cloudflare
¿Cómo encuentro los servidores DNS en Android desde un programa Java? (4)
El método java.net.InetAddress.GetByName(String host)
solo puede devolver registros A
para buscar otros tipos de registros. Necesito poder enviar consultas DNS utilizando la biblioteca dnsjava
.
Sin embargo, eso normalmente depende de 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 utilizando el comando getprop
.
¿Puede alguien decirme cómo obtener esas configuraciones de Java que no sea generando un shell con Runtime.exec()
y analizando el resultado de getprop
?
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, se pueden usar métodos estáticos en esta clase ( android.os.SystemProperties ). Como no es una API abierta, no puedes compilarla contra el SDK. Hay que trabajar para hacerlo, por ejemplo, copiar el código de AOSP para obtener la compilación. Como esta clase es para uso interno, hazlo bajo tu propio riesgo. Que te diviertas.
El protocolo DNS no es tan complejo. ¿No puedes hacer los accesos DNS utilizando sockets sin procesar (ya sea TCP o UDP)? Después de una rápida mirada al dnsjava doco, parece proporcionar soporte DNS de bajo nivel para ayudar con esto.
La otra dirección posible es, comenzando con dnsjava, eliminar la dependencia de /etc/resolv.conf
. Pensaría en usar getprop en su secuencia de comandos de inicio para establecer propiedades en la JVM, o para crear un archivo localizado resolv.conf
en el directorio de su aplicación desde el cual pueda 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, la creación de un archivo que dnsjava pueda usar directamente debería ser factible.
Editar - android.net
Parece que android.net.ConnectivityManager
le entregará una matriz de información de getAllNetworkInfo()
utilizando getAllNetworkInfo()
. Luego use android.net.NetworkUtils.runDhcp()
para obtener un DhcpInfo para cualquier interfaz de red determinada: la estructura DhcpInfo tiene la dirección IP para dns1 y dns2 para esa interfaz. Sorprendido de que los DNS son int, por lo tanto, implica solo IP4.
Deberíamos ser capaces de encontrar la dirección DNS independientemente de la red (wifi o ethernet) con la que estamos conectados. Aquí está mi programa.
En su archivo AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Tu codigo:
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 {
}
No puede comunicarse para saber si está conectado a través de wifi o red utilizando WifiManager
ya que WifiManager
solo trata con wifi. Tienes que usar ConnectivityManager
. WifiManager
el código nuevamente donde WifiManager
y ConnectivityManager
para producir el resultado que deseaba.