Как найти DNS-серверы в Android из Java-программы? - PullRequest
14 голосов
/ 30 октября 2008

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

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

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

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

Ответы [ 4 ]

12 голосов
/ 06 февраля 2009

Протокол 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.

4 голосов
/ 22 декабря 2008

Я не думаю, что это возможно в общем случае. Для WiFi я нашел это:

WiFiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE); 
DhcpInfo info = wifi.getDhcpInfo(); 
2 голосов
/ 18 апреля 2012

Чтобы получить системные свойства системы Android, можно использовать статические методы в этом классе ( android.os.SystemProperties ). Поскольку это не открытый API, вы не можете скомпилировать его с SDK. Для этого нужно обойти, например, скопируйте код из AOSP, чтобы получить компиляцию. Поскольку этот класс предназначен для внутреннего использования, делайте это на свой страх и риск. Веселитесь.

1 голос
/ 22 сентября 2017

Мы должны быть в состоянии найти адрес 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 {

                }

выход enter image description here

Вы не можете узнать, подключены ли вы через Wi-Fi или по сети, используя WifiManager, поскольку WifiManager работает только с Wi-Fi. Вы должны использовать ConnectivityManager. Я снова обновил код, где объединил WifiManager и ConnectivityManager, чтобы получить желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...