public class DnsUtil {
/**
* 获取dns
*
* @param context
* @return
*/
public static String getDns(Context context) {
/**
* 获取dns
*/
String[] dnsServers = getDnsFromCommand();
if (dnsServers == null || dnsServers.length == 0) {
dnsServers = getDnsFromConnectionManager(context);
}
/**
* 组装
*/
StringBuffer sb = new StringBuffer();
if (dnsServers != null) {
for (int i = 0; i < dnsServers.length; i++) {
sb.append(dnsServers[i]);
sb.append(" / ");
}
}
//
return sb.toString();
}
//通过 getprop 命令获取
private static String[] getDnsFromCommand() {
LinkedList<String> dnsServers = new LinkedList<>();
try {
Process process = Runtime.getRuntime().exec("getprop");
InputStream inputStream = process.getInputStream();
LineNumberReader lnr = new LineNumberReader(new InputStreamReader(inputStream));
String line = null;
while ((line = lnr.readLine()) != null) {
int split = line.indexOf("]: [");
if (split == -1) continue;
String property = line.substring(1, split);
String value = line.substring(split + 4, line.length() - 1);
if (property.endsWith(".dns")
|| property.endsWith(".dns1")
|| property.endsWith(".dns2")
|| property.endsWith(".dns3")
|| property.endsWith(".dns4")) {
InetAddress ip = InetAddress.getByName(value);
if (ip == null) continue;
value = ip.getHostAddress();
if (value == null) continue;
if (value.length() == 0) continue;
dnsServers.add(value);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return dnsServers.isEmpty() ? new String[0] : dnsServers.toArray(new String[dnsServers.size()]);
}
private static String[] getDnsFromConnectionManager(Context context) {
LinkedList<String> dnsServers = new LinkedList<>();
if (Build.VERSION.SDK_INT >= 21 && context != null) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetworkInfo != null) {
for (Network network : connectivityManager.getAllNetworks()) {
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network);
if (networkInfo != null && networkInfo.getType() == activeNetworkInfo.getType()) {
LinkProperties lp = connectivityManager.getLinkProperties(network);
for (InetAddress addr : lp.getDnsServers()) {
dnsServers.add(addr.getHostAddress());
}
}
}
}
}
}
return dnsServers.isEmpty() ? new String[0] : dnsServers.toArray(new String[dnsServers.size()]);
}
}
- 这种方式是有缺陷的:
wifi情况下,高版本的手机获取到的dns是内网ip(反而是一些低版本的手机,或者比较老的手机没这个问题)
- 网易有一个获取dns地址的get请求地址:http://xx.nstool.netease.com
暂时没有找到一个完美的办法获取DNS,有了解的同学,请留言