簡體   English   中英

如何從Java程序中找到Android中的DNS服務器?

[英]How do I find the DNS servers in Android from a Java program?

java.net.InetAddress.GetByName(String host)方法只能返回A記錄,以便查找我需要能夠使用dnsjava庫發送DNS查詢的其他記錄類型。

但是,這通常依賴於能夠解析/etc/resolv.conf或類似內容來查找DNS服務器地址,這在Android上不起作用。

Android上的當前DNS設置顯然只能通過使用getprop命令從shell中getprop

任何人都可以告訴我如何從Java獲取這些設置,而不是通過使用Runtime.exec()生成shell並解析getprop的輸出?

DNS協議並不復雜 - 你不能只使用原始套接字(TCP或UDP)進行DNS訪問嗎? 在快速瀏覽dnsjava doco之后,它似乎提供了低級別的DNS支持來幫助解決這個問題。

另一個可能的方向是,從dnsjava開始,刪除對/etc/resolv.conf的依賴。 我會考慮在啟動腳本中使用getprop來設置JVM中的屬性,或者在應用程序的目錄中創建一個本地化的resolv.conf文件,您可以從中讀取所需的信息。 換句話說,使用getprop將信息注入JVM,而不是在JVM運行時嘗試將其拉入。 當然,創建一個dnsjava可以直接使用的文件應該是可行的。


編輯 - android.net

看起來android.net.ConnectivityManager將使用getAllNetworkInfo()為您提供NetworkInfo數組。 然后使用android.net.NetworkUtils.runDhcp()為任何給定的網絡接口獲取DhcpInfo - DhcpInfo結構具有該接口的dns1和dns2的IP地址。 令人驚訝的是DNS是int,因此僅暗示IP4。

我不認為一般情況是可能的。 對於WiFi,我發現了這個:

WiFiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE); 
DhcpInfo info = wifi.getDhcpInfo(); 

要獲取android系統的系統屬性,可以使用此類中的靜態方法( android.os.SystemProperties )。 由於它不是一個開放的api,你無法針對sdk進行編譯。 需要解決這個問題,例如從AOSP復制代碼以通過編譯。 由於此課程供內部使用,請自行承擔風險。 玩得開心。

我們應該能夠找到與我們連接的網絡(wifi或以太網)無關的DNS地址。 這是我的計划。

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 {

                }

產量 在此輸入圖像描述

您無法通過WifiManager了解您是通過wifi還是網絡連接,因為WifiManager僅處理wifi。 您必須使用ConnectivityManager 我再次更新了代碼,我合並了WifiManagerConnectivityManager以生成您想要的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM