18

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

但是,这通常依赖于能够解析/etc/resolv.conf或类似的方法来查找 DNS 服务器地址,而这在 Android 上不起作用。

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

谁能告诉我如何从 Java 中获取这些设置,而不是通过生成 shellRuntime.exec()并解析输出getprop

4

4 回答 4

15

DNS 协议并没有那么复杂——您不能只使用原始套接字(TCP 或 UDP)进行 DNS 访问吗?在快速浏览了 dnsjava doco 之后,它似乎提供了低级别的 DNS 支持来帮助解决这个问题。

另一个可能的方向是,从 dnsjava 开始,消除对/etc/resolv.conf. 我会考虑在您的启动脚本中使用 getprop 来设置 JVM 中的属性,或者resolv.conf在您的应用程序目录中创建一个本地化文件,您可以从中读取所需的信息。换句话说,使用 getprop 将信息注入 JVM,而不是在 JVM 运行后尝试将其拉入。当然,创建一个 dnsjava 可以直接使用的文件应该是可行的。


编辑 - android.net

看起来android.net.ConnectivityManager会为您提供一系列 NetworkInfo 的 using getAllNetworkInfo(). 然后用于android.net.NetworkUtils.runDhcp()获取任何给定网络接口的 DhcpInfo - DhcpInfo结构具有该接口的 dns1 和 dns2 的 IP 地址。令人惊讶的是,DNS 是 int,因此仅暗示 IP4。

于 2009-02-06T03:15:52.083 回答
5

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

WiFiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE); 
DhcpInfo info = wifi.getDhcpInfo(); 
于 2008-12-22T08:50:29.500 回答
2

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

于 2012-04-18T12:16:44.040 回答
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 {

                }

输出 在此处输入图像描述

您无法知道您是通过 wifi 连接还是使用WifiManagerWifiManager与 wifi 交易的网络连接。你必须使用ConnectivityManager. 我再次更新了我合并的代码WifiManagerConnectivityManager产生了你想要的结果。

于 2017-09-22T16:11:12.610 回答