簡體   English   中英

Android:檢查網絡和真實的互聯網連接

[英]Android: Check network and real internet connectivity

以下是一段Android代碼,可以很好地檢查網絡是否已連接。

public static boolean isNetworkAvailable(Context context) 
{
    ConnectivityManager mConnectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    return (mConnectivityManager != null && mConnectivityManager.getActiveNetworkInfo().isConnectedOrConnecting()) ? true : false;
}

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

但是擁有活動的網絡接口並不能保證特定的網絡服務可用。

我們已經連接到網絡,但是仍然無法訪問普通的互聯網網絡服務,例如Google

常見情況:

  1. 連接到Wi-Fi(實際上是專用網絡)的Android設備。 所以isNetworkAvailable將返回該網絡已連接,但無法連接到任何其他服務
  2. 有時電話信號顯示它已連接到服務提供商數據計划。 因此網絡連接是正確的,但仍然無法訪問Google / Yahoo。

一種方法是檢查“ isNetworkAvailable”函數是否返回TRUE,然后運行以下代碼

HttpGet request = new HttpGet(url));
   HttpParams httpParameters = new BasicHttpParams();
   int timeoutConnection = 60000;
   HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
   int timeoutSocket = 60000;
   HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

   DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
   request.addHeader("Content-Type", "application/json");
   HttpResponse response = httpClient.execute(request);

   HttpEntity entity = response.getEntity();


     if (entity != null)
      {
         result = EntityUtils.toString(entity);
      }

   }
 catch (SocketException e)
  {
     return "Socket Exceptiopn:" + e.toString();
  }
 catch (Exception e)
  {
     return "General Execption:" + e.toString();
  }

但是我認為這不是一個好方法,因為它可能會花費很多時間

那么,是否有任何其他有效的方式(就所花費的時間,速度而言)可確保我們連接到網絡並可以訪問大多數常見的Internet服務?

檢查此代碼...對我有用:)

public static void isNetworkAvailable(final Handler handler, final int timeout) {

        // ask fo message '0' (not connected) or '1' (connected) on 'handler'
        // the answer must be send before before within the 'timeout' (in milliseconds)

        new Thread() {

            private boolean responded = false;

            @Override
            public void run() {

                // set 'responded' to TRUE if is able to connect with google mobile (responds fast)

                new Thread() {

                    @Override
                    public void run() {
                        HttpGet requestForTest = new HttpGet("http://m.google.com");
                        try {
                            new DefaultHttpClient().execute(requestForTest); // can last...
                            responded = true;
                        } catch (Exception e) {}
                    }

                }.start();

                try {
                    int waited = 0;
                    while(!responded && (waited < timeout)) {
                        sleep(100);
                        if(!responded ) { 
                            waited += 100;
                        }
                    }
                } 
                catch(InterruptedException e) {} // do nothing 
                finally { 
                    if (!responded) { handler.sendEmptyMessage(0); } 
                    else { handler.sendEmptyMessage(1); }
                }

            }

        }.start();

}

然后,定義處理程序:

Handler h = new Handler() {

    @Override
    public void handleMessage(Message msg) {

        if (msg.what != 1) { // code if not connected

        } else { // code if connected

        }

    }
};

並啟動測試:

isNetworkAvailable(h,2000); // get the answser within 2000 ms

來自Gilbou的代碼https://stackoverflow.com/a/5803489/2603719

希望我能幫到你

問題1:
連接到Wi-Fi(實際上是專用網絡)的Android設備。
所以isNetworkAvailable將返回該網絡已連接,但無法連接到任何其他服務。

問題2:
有時電話信號顯示它已連接到服務提供商的數據計划。 因此網絡連接為true,但仍無法訪問google / yahoo。

I'm not sure about Issue #1 but I'm sure that following approach will solve Issue #2.

最終,您將需要監視網絡連接的變化,

第1步:

只需注冊一個BroadcastReceiver進行以下操作

<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>

第2步:

當您在onReceive(Context context,Intent intent)方法上獲得回調時,請檢查連接狀態。

即: boolean isConnected = getIntent().getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY);

//除了EXTRA_NO_CONNECTIVITY ,還有其他一些參數對於監視

參考:

例子:

步驟1,步驟2的工作示例:如何在Android中監控網絡連接

Android的得到通知的-的連通性,變化

Github:網絡檢測通知示例

Android文件:

連接監控

連接管理器

我希望這會有所幫助!

使用此代碼檢查Internet連接,它檢查設備上的所有Internet連接。 並確保您已在清單中添加了Internet權限。

        boolean flag=false;
        ConnectivityManager connectivity = (ConnectivityManager) getApplicationContext().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)
                    {
                        flag=true;

                    }

        }
        if(flag==true)
        {
             Log.e("TAG","Internet Is Connected");
        }
        else
        {
              Log.e("TAG","Internet Is Not Connected");
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM