安卓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,则需要等待较长的时间。
以上。本人经验尚浅,不足之处还望大神给予指导。谢谢!