Как мне найти DNS-серверы в Android из программы Java?

Метод java.net.InetAddress.GetByName(String host) может возвращать только записи A, поэтому для поиска других типов записей мне нужно иметь возможность отправлять DNS-запросы с использованием библиотеки dnsjava.

Однако это обычно зависит от возможности синтаксического анализа /etc/resolv.conf или аналогичного для поиска адресов DNS-серверов, и это не работает на Android.

Текущие настройки DNS на Android, по-видимому, можно получить только из оболочки с помощью команды getprop.

Может ли кто-нибудь сказать мне, как получить эти настройки из Java, кроме как путем создания оболочки с Runtime.exec() и анализа вывода из getprop?

AFAIK нет другого способа, как Runtime.exec("getprop"), получить текущий DNS-сервер для мобильных подключений WiFi и.

Flow 04.06.2012 23:14
18
1
17 134
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я не думаю, что это возможно в общем случае. Для 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

Похоже, что android.net.ConnectivityManager доставит вам массив NetworkInfo, используя getAllNetworkInfo(). Затем используйте android.net.NetworkUtils.runDhcp(), чтобы получить DhcpInfo для любого заданного сетевого интерфейса - структура DhcpInfo имеет IP-адрес для dns1 и dns2 для этого интерфейса. Удивлен, что DNS - это int, поэтому подразумевается только IP4.

это означает вставку чего-либо в последовательность загрузки телефона, что не может сделать обычное приложение, а также не справляется с изменением DNS-серверов, поскольку различные методы доступа приходят и уходят в автономный режим.

Alnitak 06.02.2009 10:16

Чтобы получить системные свойства системы 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, чтобы получить желаемый результат.

Другие вопросы по теме