Jak najdu servery DNS v Android z Java programu?

hlasů
13

java.net.InetAddress.GetByName(String host)Metoda může vrátit pouze Azáznamy tak, aby vyhledávání jiné typy záznamů, které potřebuji, aby bylo možné odesílat dotazy DNS pomocí dnsjavaknihovny.

Však, že za normálních okolností závisí na schopnosti analyzovat /etc/resolv.confnebo podobný najít adresy serverů DNS a že nefunguje na platformě Android.

Aktuální nastavení DNS v systému Android lze zřejmě získat pouze zevnitř shellu pomocí getproppříkazu.

Může mi někdo říct, jak se dostat ty nastavení z Javy jinak než plodit shell Runtime.exec()a rozebrat výstup od getprop?

Položena 30/10/2008 v 12:49
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
10

Protokol DNS není tak složité - prostě nemůžete dělat DNS přistupuje pomocí raw socket (TCP nebo UDP)? Po rychlém pohled na dnsjava Doco zdá poskytovat nízkou podporu na úrovni DNS na pomoc s tímto.

Druhý možný směr, počínaje dnsjava, odstranit závislost na /etc/resolv.conf. Řekla bych, že o použití GetProp ve svém startu skriptu nastavit vlastnosti v JVM, nebo vytvořit lokální resolv.confsoubor v adresáři vaší aplikace, ze kterých si můžete přečíst potřebné informace. Jinými slovy, pouze GetProp vstříknout informací do JVM namísto pokusu vytáhnout ji jednou JVM se děje. Jistě vytvořit soubor, který dnsjava lze použít přímo musí být proveditelné.


Edit - android.net

Vypadá to, že android.net.ConnectivityManagerpřinese vám řadu NetworkInfo je používání getAllNetworkInfo(). Pak použijte android.net.NetworkUtils.runDhcp()získat DhcpInfo pro daný síťové rozhraní - za DhcpInfo struktura má IP adresu DNS1 a DNS2 pro toto rozhraní. Překvapen, že DNS je být int, tedy znamenat, IP4 jen, ačkoli.

Odpovězeno 06/02/2009 v 04:15
zdroj uživatelem

hlasů
4

Nemyslím si, že je možné, aby obecný případ. Pro WiFi jsem našel toto:

WiFiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE); 
DhcpInfo info = wifi.getDhcpInfo(); 
Odpovězeno 22/12/2008 v 09:50
zdroj uživatelem

hlasů
2

Chcete-li získat vlastnosti systému android systému, statické metody v této třídě ( android.os.SystemProperties lze použít). Neboť není otevřené API, nelze kompilovat proti SDK. Obejít k tomu, že např zkopírujte kód z AOSP dostat přes kompilaci je potřeba. Vzhledem k tomu, třída je určena pro vnitřní použití, to na vlastní nebezpečí. Bavit.

Odpovězeno 18/04/2012 v 13:16
zdroj uživatelem

hlasů
1

Měli bychom být schopni najít dns adresa se bez ohledu na to, do jaké sítě (Wi-Fi nebo Ethernet) jsme spojeni. Tady je můj program.

Ve vašem AndroidManifest.xml souboru

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Váš kód:

    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 {

                }

Výstup zadejte popis obrázku zde

Nemůžete dostat vědět, zda jste připojeni přes Wi-Fi nebo síť s použitím WifiManageras WifiManagerse zabývá pouze s Wi-Fi. Budete muset použít ConnectivityManager. Znovu jsem aktualizoval kódu, kde jsem se spojil WifiManagera ConnectivityManagervyrobit za následek, že jste chtěli.

Odpovězeno 22/09/2017 v 16:11
zdroj uživatelem

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