安卓SDK提供了ConnectivityManager類,那么我們就可以輕松的獲取設備的網絡狀態以及聯網方式等信息。
但是要想知道安卓設備連接的網絡能不能訪問到Internet,就要費一番周折了。
本文為大家介紹三種方式來檢查Internet連接狀態。
1、使用Linux系統ping ip的命令方式檢查設備的Internet連接狀態。
2、使用HttpURLConnection的get請求方式檢查設備的Internet連接狀態。(可以設置超時時長)
3、使用java.net.InetAddress解析域名的方式檢查設備的Internet連接狀態。(可以設置超時時長)
貼出檢查方法以供參考,如下:
一、ping IP方式:
public class NetWorkUtils{ /** * 檢查互聯網地址是否可以訪問 * * @param address 要檢查的域名或IP地址 * @param callback 檢查結果回調(是否可以ping通地址){@see java.lang.Comparable<T>} */ public static void isNetWorkAvailable(final String address, final Comparable<Boolean> callback) { final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (callback != null) { callback.compareTo(msg.arg1 == 0); } } }; new Thread(new Runnable() { @Override public void run() { Runtime runtime = Runtime.getRuntime(); Message msg = new Message(); try { Process pingProcess = runtime.exec("/system/bin/ping -c 1 " + address); InputStreamReader isr = new InputStreamReader(pingProcess.getInputStream()); BufferedReader buf = new BufferedReader(isr); if (buf.readLine() == null) { msg.arg1 = -1; } else { msg.arg1 = 0; } buf.close(); isr.close(); } catch (Exception e) { msg.arg1 = -1; e.printStackTrace(); } finally { runtime.gc(); handler.sendMessage(msg); } } }).start(); } }
可以使用ping www.baidu.com,進行測試。當然,你也可以ping你們的服務器地址。如下:
NetWorkUtils.isNetWorkAvailable("www.baidu.com", new Comparable<Boolean>() { @Override public int compareTo(Boolean available) { if (available) { // TODO 設備訪問Internet正常 } else { // TODO 設備無法訪問Internet } return 0; } });
二、get請求方式:
public class NetWorkUtils{ /** * 檢查互聯網地址是否可以訪問-使用get請求 * * @param urlStr 要檢查的url * @param callback 檢查結果回調(是否可以get請求成功){@see java.lang.Comparable<T>} */ public static void isNetWorkAvailableOfGet(final String urlStr, final Comparable<Boolean> callback) { final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (callback != null) { callback.compareTo(msg.arg1 == 0); } } }; new Thread(new Runnable() { @Override public void run() { Message msg = new Message(); try { Connection conn = new Connection(urlStr); Thread thread = new Thread(conn); thread.start(); thread.join(3 * 1000); // 設置等待DNS解析線程響應時間為3秒 int resCode = conn.get(); // 獲取get請求responseCode msg.arg1 = resCode == 200 ? 0 : -1; } catch (Exception e) { msg.arg1 = -1; e.printStackTrace(); } finally { handler.sendMessage(msg); } } }).start(); } /** * HttpURLConnection請求線程 */ private static class Connection implements Runnable { private String urlStr; private int responseCode; public Connection(String urlStr) { this.urlStr = urlStr; } public void run() { try { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.connect(); set(conn.getResponseCode()); } catch (Exception e) { e.printStackTrace(); } } public synchronized void set(int responseCode) { this.responseCode = responseCode; } public synchronized int get() { return responseCode; } } }
可以請求http://www.baidu.com,進行測試。當然,你也可以寫你們的服務器地址。如下:
NetWorkUtils.isNetWorkAvailableOfGet("http://www.baidu.com", new Comparable<Boolean>() { @Override public int compareTo(Boolean available) { if (available) { // TODO 設備訪問Internet正常 } else { // TODO 設備無法訪問Internet } return 0; } });
三、DNS解析方式:
public class NetWorkUtils{ /** * 檢查互聯網地址是否可以訪問-使用DNS解析 * * @param hostname 要檢查的域名或IP * @param callback 檢查結果回調(是否可以解析成功){@see java.lang.Comparable<T>} */ public static void isNetWorkAvailableOfDNS(final String hostname, final Comparable<Boolean> callback) { final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (callback != null) { callback.compareTo(msg.arg1 == 0); } } }; new Thread(new Runnable() { @Override public void run() { Message msg = new Message(); try { DNSParse parse = new DNSParse(hostname); Thread thread = new Thread(parse); thread.start(); thread.join(3 * 1000); // 設置等待DNS解析線程響應時間為3秒 InetAddress resCode = parse.get(); // 獲取解析到的IP地址 msg.arg1 = resCode == null ? -1 : 0; } catch (Exception e) { msg.arg1 = -1; e.printStackTrace(); } finally { handler.sendMessage(msg); } } }).start(); } /** * DNS解析線程 */ private static class DNSParse implements Runnable { private String hostname; private InetAddress address; public DNSParse(String hostname) { this.hostname = hostname; } public void run() { try { set(InetAddress.getByName(hostname)); } catch (Exception e) { e.printStackTrace(); } } public synchronized void set(InetAddress address) { this.address = address; } public synchronized InetAddress get() { return address; } } }
可以解析百度www.baidu.com,進行測試。當然,你也可以解析自己的域名。如下:
NetWorkUtils.isNetWorkAvailableOfDNS("www.baidu.com", new Comparable<Boolean>() { @Override public int compareTo(Boolean available) { if (available) { // TODO 設備訪問Internet正常 } else { // TODO 設備無法訪問Internet } return 0; } });
本文只為測試網絡連接狀態使用,用到了三種常用的Internet狀態檢查方式,如果想在做某些網絡操作之前檢查Internet是否連通,建議使用后兩種方式,可以自己定義等待響應的時間。我設置的是3秒。如果使用ping IP的方式的話,如果無法訪問到Internet,則需要等待較長的時間。
以上。本人經驗尚淺,不足之處還望大神給予指導。謝謝!
轉:https://blog.csdn.net/sgyingyin/article/details/70174402