如何从Java程序中找到Android中的DNS服务器?

时间:2008-10-30 11:49:50

标签: android dns java

java.net.InetAddress.GetByName(String host)方法只能返回A条记录,以便查找我需要能够使用dnsjava库发送DNS查询的其他记录类型。

但是,这通常依赖于能够解析/etc/resolv.conf或类似内容以查找DNS服务器地址,而这在Android上无效。

Android上的当前DNS设置显然只能通过使用getprop命令从shell中获取。

除了通过Runtime.exec()生成shell并解析getprop的输出之外,有人能告诉我如何从Java获取这些设置吗?

4 个答案:

答案 0 :(得分:12)

DNS protocol并不复杂 - 你不能只使用原始套接字(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。

答案 1 :(得分:4)

我认为一般情况不可能。对于WiFi,我发现了这个:

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

答案 2 :(得分:2)

要获取android系统的系统属性,可以使用此类(android.os.SystemProperties)中的静态方法。 由于它不是一个开放的api,你无法针对sdk进行编译。需要解决这个问题,例如,从AOSP复制代码以通过编译。 由于此课程供内部使用,请自行承担风险。 玩得开心。

答案 3 :(得分:1)

我们应该能够找到与我们连接的网络(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 {

                }

<强>输出 enter image description here

您无法通过使用WifiManager来了解您是通过wifi还是网络连接,因为WifiManager仅处理wifi。您必须使用ConnectivityManager。我在合并WifiManagerConnectivityManager的位置再次更新了代码,以生成您想要的结果。