Android检查设备是否可以访问互联网,判断Internet连接,测试网络请求,解析域名

安卓SDK提供了ConnectivityManager类,那么我们就可以轻松的获取设备的网络状态以及联网方式等信息。 
但是要想知道安卓设备连接的网络能不能访问到Internet,就要费一番周折了。 
本文为大家介绍三种方式来检查Internet连接状态。

1、使用Linux系统ping ip的命令方式检查设备的Internet连接状态。 
2、使用HttpURLConnection的get请求方式检查设备的Internet连接状态。(可以设置超时时长) 
3、使用java.net.InetAddress解析域名的方式检查设备的Internet连接状态。(可以设置超时时长)

贴出检查方法以供参考,如下:

一、ping IP方式:

1public class NetWorkUtils{ 2 3 /** 4 * 检查互联网地址是否可以访问 5 * 6 * @param address 要检查的域名或IP地址 7 * @param callback 检查结果回调(是否可以ping通地址){@see java.lang.Comparable<T>} 8 */ 9 public static void isNetWorkAvailable(final String address, final Comparable<Boolean> callback) { 10 final Handler handler = new Handler() { 11 12 @Override 13 public void handleMessage(Message msg) { 14 super.handleMessage(msg); 15 if (callback != null) { 16 callback.compareTo(msg.arg1 == 0); 17 } 18 } 19 20 }; 21 new Thread(new Runnable() { 22 23 @Override 24 public void run() { 25 Runtime runtime = Runtime.getRuntime(); 26 Message msg = new Message(); 27 try { 28 Process pingProcess = runtime.exec("/system/bin/ping -c 1 " + address); 29 InputStreamReader isr = new InputStreamReader(pingProcess.getInputStream()); 30 BufferedReader buf = new BufferedReader(isr); 31 if (buf.readLine() == null) { 32 msg.arg1 = -1; 33 } else { 34 msg.arg1 = 0; 35 } 36 buf.close(); 37 isr.close(); 38 } catch (Exception e) { 39 msg.arg1 = -1; 40 e.printStackTrace(); 41 } finally { 42 runtime.gc(); 43 handler.sendMessage(msg); 44 } 45 } 46 47 }).start(); 48 } 49 50}

可以使用ping www.baidu.com,进行测试。当然,你也可以ping你们的服务器地址。如下:

1NetWorkUtils.isNetWorkAvailable("www.baidu.com", new Comparable<Boolean>() { 2 3 @Override 4 public int compareTo(Boolean available) { 5 if (available) { 6 // TODO 设备访问Internet正常 7 } else { 8 // TODO 设备无法访问Internet 9 } 10 return 0; 11 } 12 13});

二、get请求方式:

1public class NetWorkUtils{ 2 3 /** 4 * 检查互联网地址是否可以访问-使用get请求 5 * 6 * @param urlStr 要检查的url 7 * @param callback 检查结果回调(是否可以get请求成功){@see java.lang.Comparable<T>} 8 */ 9 public static void isNetWorkAvailableOfGet(final String urlStr, final Comparable<Boolean> callback) { 10 final Handler handler = new Handler() { 11 12 @Override 13 public void handleMessage(Message msg) { 14 super.handleMessage(msg); 15 if (callback != null) { 16 callback.compareTo(msg.arg1 == 0); 17 } 18 } 19 20 }; 21 new Thread(new Runnable() { 22 23 @Override 24 public void run() { 25 Message msg = new Message(); 26 try { 27 Connection conn = new Connection(urlStr); 28 Thread thread = new Thread(conn); 29 thread.start(); 30 thread.join(3 * 1000); // 设置等待DNS解析线程响应时间为3秒 31 int resCode = conn.get(); // 获取get请求responseCode 32 msg.arg1 = resCode == 200 ? 0 : -1; 33 } catch (Exception e) { 34 msg.arg1 = -1; 35 e.printStackTrace(); 36 } finally { 37 handler.sendMessage(msg); 38 } 39 } 40 41 }).start(); 42 } 43 44 /** 45 * HttpURLConnection请求线程 46 */ 47 private static class Connection implements Runnable { 48 private String urlStr; 49 private int responseCode; 50 51 public Connection(String urlStr) { 52 this.urlStr = urlStr; 53 } 54 55 public void run() { 56 try { 57 URL url = new URL(urlStr); 58 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 59 conn.setRequestMethod("GET"); 60 conn.connect(); 61 set(conn.getResponseCode()); 62 } catch (Exception e) { 63 e.printStackTrace(); 64 } 65 } 66 67 public synchronized void set(int responseCode) { 68 this.responseCode = responseCode; 69 } 70 71 public synchronized int get() { 72 return responseCode; 73 } 74 } 75 76}

可以请求http://www.baidu.com,进行测试。当然,你也可以写你们的服务器地址。如下:

1NetWorkUtils.isNetWorkAvailableOfGet("http://www.baidu.com", new Comparable<Boolean>() { 2 3 @Override 4 public int compareTo(Boolean available) { 5 if (available) { 6 // TODO 设备访问Internet正常 7 } else { 8 // TODO 设备无法访问Internet 9 } 10 return 0; 11 } 12 13});

三、DNS解析方式:

1public class NetWorkUtils{ 2 3 /** 4 * 检查互联网地址是否可以访问-使用DNS解析 5 * 6 * @param hostname 要检查的域名或IP 7 * @param callback 检查结果回调(是否可以解析成功){@see java.lang.Comparable<T>} 8 */ 9 public static void isNetWorkAvailableOfDNS(final String hostname, final Comparable<Boolean> callback) { 10 final Handler handler = new Handler() { 11 12 @Override 13 public void handleMessage(Message msg) { 14 super.handleMessage(msg); 15 if (callback != null) { 16 callback.compareTo(msg.arg1 == 0); 17 } 18 } 19 20 }; 21 new Thread(new Runnable() { 22 23 @Override 24 public void run() { 25 Message msg = new Message(); 26 try { 27 DNSParse parse = new DNSParse(hostname); 28 Thread thread = new Thread(parse); 29 thread.start(); 30 thread.join(3 * 1000); // 设置等待DNS解析线程响应时间为3秒 31 InetAddress resCode = parse.get(); // 获取解析到的IP地址 32 msg.arg1 = resCode == null ? -1 : 0; 33 } catch (Exception e) { 34 msg.arg1 = -1; 35 e.printStackTrace(); 36 } finally { 37 handler.sendMessage(msg); 38 } 39 } 40 41 }).start(); 42 } 43 44 /** 45 * DNS解析线程 46 */ 47 private static class DNSParse implements Runnable { 48 private String hostname; 49 private InetAddress address; 50 51 public DNSParse(String hostname) { 52 this.hostname = hostname; 53 } 54 55 public void run() { 56 try { 57 set(InetAddress.getByName(hostname)); 58 } catch (Exception e) { 59 e.printStackTrace(); 60 } 61 } 62 63 public synchronized void set(InetAddress address) { 64 this.address = address; 65 } 66 67 public synchronized InetAddress get() { 68 return address; 69 } 70 } 71 72}

可以解析百度www.baidu.com,进行测试。当然,你也可以解析自己的域名。如下:

1NetWorkUtils.isNetWorkAvailableOfDNS("www.baidu.com", new Comparable<Boolean>() { 2 3 @Override 4 public int compareTo(Boolean available) { 5 if (available) { 6 // TODO 设备访问Internet正常 7 } else { 8 // TODO 设备无法访问Internet 9 } 10 return 0; 11 } 12 13});

本文只为测试网络连接状态使用,用到了三种常用的Internet状态检查方式,如果想在做某些网络操作之前检查Internet是否连通,建议使用后两种方式,可以自己定义等待响应的时间。我设置的是3秒。如果使用ping IP的方式的话,如果无法访问到Internet,则需要等待较长的时间。


以上。本人经验尚浅,不足之处还望大神给予指导。谢谢!

转:https://blog.csdn.net/sgyingyin/article/details/70174402

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Android app ADB命令

\查看设备adbdevicesps这个命令是查看当前连接的设备,连接到计算机的android设备或者模拟器将会列出显示若有多台安卓设备,可以通过在adb后面加上s<设备id对指定设备进行装包、卸载等操作\启动adbadbstartserver\关闭adbadbkillserver\安装软件