2012-11-15 35 views
14

Android究竟如何確定以下狀態之間的差異?Android究竟如何確定它是否在線?

  1. 網絡接口有效(例如Wifi或3G),但無法訪問互聯網。

  2. 網絡接口處於活動狀態,需要請求用戶登錄到網頁上的網絡。

  3. 有一個網絡接口激活並能夠訪問互聯網。

它可能會發送一個簡單的HTTP請求到一個固定的URL(也許在google.com上?)並檢查返回的文檔是否符合要求?如果是這樣,我們是否知道使用的網址?

回答

0

是的,你也可以發送ping :)

你應該在小型網絡中的Util類使用的操作順序是: - 檢查接口在線 - 檢查其是否能打開一個套接字到google.com或ping google.com

0

試試這個:

public static boolean isNetworkAvailable(Context context) 
{ 
    ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo info = cm.getActiveNetworkInfo(); 

    return (info != null); 
} 
1

UPDATE:更新的代碼,以避免NetworkOnMainThreadException

我目前使用下面的方法來確定設備是否可以訪問互聯網或不:

public class NetworkConnectivityHelper { 
    public void isDeviceConnectedToInternet(final Activity activity, final ResultCallback callback){ 

     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       boolean isDeviceConnectedToInternet = false; 
       NetworkInfo activeNetworkInfo = ((ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); 

       if(activeNetworkInfo != null && activeNetworkInfo.isConnected()){ 
        try { 
         InetAddress.getByName("google.com").isReachable(2); 
         isDeviceConnectedToInternet = true; 
        } catch (UnknownHostException e){ 
         isDeviceConnectedToInternet = false; 
        } catch (IOException e){ 
         isDeviceConnectedToInternet = false; 
        } 
       } 

       final boolean result = isDeviceConnectedToInternet; 
       activity.runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         callback.done(result); 
        } 
       }); 

      } 
     }).start(); 

    } 


    public static abstract class ResultCallback{ 
     public abstract void done(boolean connected); 
    } 
} 

稱這種由:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    .... 
    //Populate 
    NetworkConnectivityHelper networkConnectivityHelper = new NetworkConnectivityHelper(); 
    networkConnectivityHelper.isDeviceConnectedToInternet(activity, new NetworkConnectivityHelper.ResultCallback() { 
     @Override 
     public void done(boolean connected) { 
      if (connected) { 
       //Yey, the device is connected. 
       //Now, do some work 
      }else{ 
       //The device is disconnected 
      } 
     } 
    }); 
    .... 

} 

希望這有助於!

+0

這將強制在更高版本的android上使用主線程上的網絡連接。另外,在我測試過的無線網絡上需要登錄,這個測試仍然返回,因爲它不應該連接。 – schwiz

相關問題