2016-08-25 59 views
-3

無論用戶是否有活躍的互聯網連接(通過活動,我的意思是用戶可以打開任何網絡URl),下面所述情況下的最佳解決方案是什麼。如何檢查我的android設備是否有連接?

  1. 通過使http請求到google.com並檢查respose代碼,或
HttpURLConnection urlc = (HttpURLConnection) 
         (new URL("http://clients3.google.com/generate_204") 
           .openConnection()); 
       urlc.setRequestProperty("User-Agent", "Android"); 
       urlc.setRequestProperty("Connection", "close"); 
       urlc.connect(); 
       Log.d("reqcode",""+urlc.getResponseCode()); 
       return (urlc.getResponseCode() == 204 && 
         urlc.getContentLength() == 0); 
  • 通過向服務器發出請求我正在使用。
  • 哪個在性能方面最好。

    +1

    可能是最好看的Android文檔張貼在這裏了。[確定和監控連接狀態](https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html) –

    +0

    [如何檢查Android上的互聯網訪問? InetAddress永不超時](http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-times-out) –

    回答

    0

    我使用下面的方法來檢查用戶是否通過移動數據或wi-fi有活動的互聯網連接。

    public static boolean isInternetConnected() { 
         ConnectivityManager connectivityManager = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE); 
         if (connectivityManager != null) { 
          NetworkInfo[] info = connectivityManager.getAllNetworkInfo(); 
          if (info != null) { 
           for (int i = 0; i < info.length; i++) { 
            if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
             return true; 
            } 
           } 
          } 
         } 
         return false; 
        } 
    

    並在清單文件中添加權限。

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    有沒有辦法來確定用戶是否具有有效連接或沒有。如果用戶沒有活動連接並在一段時間後拋出SocketTimeOutException,則在您的問題中建議的方法會導致您進入漫長的等待期。

    所以,如果你想檢查用戶是否有互聯網連接,那麼只檢查它已啓用Wi-Fi和/或數據連接,並假設數據包打開。

    +0

    不工作,我想知道如果設備有一個活動的連接(不只是連接到無線網絡)我已經實施它,它總是會返回true,除非我的wifi關閉。 –

    +0

    @AmanVerma檢查我更新的答案。 –

    +0

    是的,這是事情,我用我的問題中所述的方法,我必須等待約20秒才能得到響應代碼。雖然有另一種使用套接字的方法,但它速度很快,但在許多設備上無法工作。 Android設備使用提到的代碼來檢查活動連接 –

    0

    請勿ping網站以檢查互聯網連接。這是一個非常糟糕的做法,因爲該網站可能會永久封鎖您的應用,或者只是一臺服務器可能關閉。

    改爲使用BroadCastReceiver來收聽互聯網連接Intent。從BradcastReceiver和你onReceive使用

    private boolean isConnectedToInternet(){ 
        ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
         if (connectivity != null) 
         { 
          NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
          if (info != null) 
           for (int i = 0; i < info.length; i++) 
            if (info[i].getState() == NetworkInfo.State.CONNECTED) 
            { 
             return true; 
            } 
         } 
         return false; 
    } 
    

    內擴展您的類來檢查連接狀態。

    您可能還需要註冊和註銷的接收器在ActivityonResume()onPause()

    registerReceiver(networkChangeListener, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); 
    ... 
    unregisterReceiver(networkChangeListener); 
    
    1

    使用這樣的方法:

    private boolean isNetworkAvailable() { 
         ConnectivityManager connectivityManager 
           = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
         NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
         return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
        } 
    

    然後,只需:

    if(isNetworkAvailable()) { 
        //Do what you want with internet 
    } else { 
        //Do something wothout internet 
    } 
    

    您還需要在您的清單文件:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
    

    總之:Question

    相關問題