代码之家  ›  专栏  ›  技术社区  ›  Alnitak

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

  •  14
  • Alnitak  · 技术社区  · 16 年前

    这个 java.net.InetAddress.GetByName(String host) 方法只能返回 A 记录以便查找其他记录类型,我需要能够使用 dnsjava 图书馆。

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

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

    有人能告诉我如何从Java中获得这些设置,而不是通过生成一个shell吗? Runtime.exec() 并分析 GETPROP ?

    4 回复  |  直到 7 年前
        1
  •  11
  •   Iamat8    9 年前

    这个 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 将向您提供一系列NetworkInfo使用的 getAllNetworkInfo() . 然后使用 android.net.NetworkUtils.runDhcp() 得到一个 DHCP信息 对于任何给定的网络接口- DHCP信息 结构具有该接口的dns1和dns2的IP地址。令人惊讶的是,dns是int,因此仅表示ip4。

        2
  •  4
  •   Eugene Yokota    16 年前

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

    WiFiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE); 
    DhcpInfo info = wifi.getDhcpInfo(); 
    
        3
  •  2
  •   accuya    12 年前

    要获取Android系统的系统属性,该类中的静态方法( android.os.SystemProperties 可以使用。 因为它不是一个开放式API,所以不能根据SDK编译它。要做到这一点,需要进行变通,例如从AOSP复制代码以完成编译。 由于这个类是供内部使用的,因此请自行承担风险。 玩得高兴。

        4
  •  1
  •   Uddhav P. Gautam    7 年前

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

    您无法通过WiFi或使用 WifiManager 作为 无线传真机 只处理WiFi。你必须使用 ConnectivityManager . 我再次更新了合并处的代码 无线传真机 康涅狄格州管理者 产生你想要的结果。