Android 获取dns的值
Android 获取 DNS
2023-09-14 09:05:09 时间
在做盒子开发过程中需要获取有线网络的dns,查阅好多资料,终于搞定,现在把代码分享一下
/**
* 获取dns
*
* @param context
* @return
*/
public String getDnsFromIp(Context context) {
/**
* 获取dns
*/
String[] dnsServers = getDnsFromCmd();
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]);
}
}
//
return sb.toString();
}
//通过 getprop 命令获取
private String[] getDnsFromCmd() {
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 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()]);
}
主要是通过getprop命令来获取信息,然后拼接成最终的dns.
相关文章
- 【Android】Activity生命周期
- Android Common Utils
- [Android UI] shape和selector的结合使用
- 揭破android中的闹钟app 二
- android 获取Bitmap位图所占用的内存大小
- android --拍照,从相册获取图片,兼容高版本,兼容小米手机
- android 获取系统硬件信息
- android --拍照,从相册获取图片,兼容高版本,兼容小米手机
- 解决Android 6.0 Sim卡 iccid获取不完整问题
- Android RecyclerView 获取滑动距离
- Android 获取TARGET_OUT的值
- Android ImageButton(图片按钮)
- Android Tv ListView支持遥控器item获取焦点不能滚动的详解
- android StrictMode策略的使用详解
- 【Android 逆向】Android 进程注入工具开发 ( 远程调用 | x86 架构的返回值获取 | arm 架构远程调用 )
- 【Android 安装包优化】移除无用资源 ( 自动移除无用资源 | 直接引用资源 | 动态获取资源 id | Lint 检查资源 )
- Android底层控制系统设置的命令集合
- Android (AMS)ActivityManagerService源码分析
- Android获取Java类名/文件名/方法名/行号(四十)
- android系统服务中获取Battery信息
- Android 12.0 Toast消息框上限为两行文本(超出显示省略号)并且在文本左边显示应用图标
- Android开发 8.0及以上调用相机/相册,并根据Uri获取图像绝对路径,并进行文件上传
- Android(Kotlin)获取应用全局上下文 ApplicationContext
- Android系统信息获取 之九:TelephonyManager类