Метод java.net.InetAddress.GetByName(String host) может возвращать только записи A, поэтому для поиска других типов записей мне нужно иметь возможность отправлять DNS-запросы с использованием библиотеки dnsjava.
Однако это обычно зависит от возможности синтаксического анализа /etc/resolv.conf или аналогичного для поиска адресов DNS-серверов, и это не работает на Android.
Текущие настройки DNS на Android, по-видимому, можно получить только из оболочки с помощью команды getprop.
Может ли кто-нибудь сказать мне, как получить эти настройки из Java, кроме как путем создания оболочки с Runtime.exec() и анализа вывода из getprop?
Я не думаю, что это возможно в общем случае. Для WiFi я нашел это:
WiFiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE);
DhcpInfo info = wifi.getDhcpInfo();
Протокол DNS не так уж и сложен - разве вы не можете просто выполнить доступ к DNS с использованием сырых сокетов (TCP или UDP)? После беглого взгляда на dnsjava doco кажется, что он предоставляет низкоуровневую поддержку DNS, чтобы помочь в этом.
Другое возможное направление - начиная с dnsjava, избавиться от зависимости от /etc/resolv.conf. Я бы подумал об использовании getprop в вашем сценарии запуска, чтобы установить свойства в JVM или создать локализованный файл resolv.conf в каталоге вашего приложения, из которого вы можете прочитать необходимую информацию. Другими словами, используйте getprop для ввода информации в JVM, вместо того, чтобы пытаться вытащить ее после запуска JVM. Конечно, создание файла, который dnsjava может использовать напрямую, должно быть выполнимым.
Похоже, что android.net.ConnectivityManager доставит вам массив NetworkInfo, используя getAllNetworkInfo(). Затем используйте android.net.NetworkUtils.runDhcp(), чтобы получить DhcpInfo для любого заданного сетевого интерфейса - структура DhcpInfo имеет IP-адрес для dns1 и dns2 для этого интерфейса. Удивлен, что DNS - это int, поэтому подразумевается только IP4.
это означает вставку чего-либо в последовательность загрузки телефона, что не может сделать обычное приложение, а также не справляется с изменением DNS-серверов, поскольку различные методы доступа приходят и уходят в автономный режим.
Чтобы получить системные свойства системы Android, можно использовать статические методы этого класса (android.os.SystemProperties). Поскольку это не открытый API, вы не можете скомпилировать его с SDK. Для этого необходимо обходное решение, например скопируйте код из AOSP, чтобы выполнить компиляцию. Поскольку этот класс предназначен для внутреннего использования, делайте это на свой страх и риск. Веселиться.
Мы должны иметь возможность найти адрес DNS независимо от того, к какой сети (Wi-Fi или Ethernet) мы подключены. Вот моя программа.
В вашем файле AndroidManifest.xml
<uses-permission android:name = "android.permission.INTERNET" />
<uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" />
Ваш код:
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 {
}
Вы не можете узнать, подключены ли вы через Wi-Fi или сеть, используя WifiManager, поскольку WifiManager работает только с Wi-Fi. Вы должны использовать ConnectivityManager. Я снова обновил код, объединив WifiManager и ConnectivityManager, чтобы получить желаемый результат.
AFAIK нет другого способа, как
Runtime.exec("getprop"), получить текущий DNS-сервер для мобильных подключений WiFi и.