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

голоса
13

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

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

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

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

Задан 30/10/2008 в 12:49
источник пользователем
На других языках...                            


4 ответов

голоса
10

Протокол DNS не то, что комплекс - вы не можете просто сделать DNS доступов с использованием сокетов (либо TCP или UDP)? После того, как беглый взгляд на dnsjava DOCO это , кажется, обеспечивает поддержку низкого уровня DNS , чтобы помочь с этим.

Другим возможным направлением является, начиная с dnsjava, чтобы удалить зависимость от /etc/resolv.conf. Я бы подумать об использовании getprop в вашем запуске скрипте для установки свойств в JVM, или создать локализованный resolv.confфайл в директории вашего приложения , из которого вы можете прочитать необходимую информацию. Другими словами, используйте getprop вводить информацию в JVM вместо того , чтобы пытаться вытащить его после того , как JVM будет. Конечно , создание файла , который dnsjava можно использовать непосредственно должны быть выполнимыми.


Edit - android.net

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

Ответил 06/02/2009 в 04:15
источник пользователем

голоса
4

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

WiFiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE); 
DhcpInfo info = wifi.getDhcpInfo(); 
Ответил 22/12/2008 в 09:50
источник пользователем

голоса
2

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

Ответил 18/04/2012 в 13:16
источник пользователем

голоса
1

Мы должны быть в состоянии найти адрес DNS будучи независимо от того, в какой сети (WiFi или 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для получения результата , который вы хотели.

Ответил 22/09/2017 в 16:11
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more