2012-08-10 21 views
21

假設手機找到打開的Wi-Fi網絡並連接到它。但是Wi-Fi網絡是「非活動」的,即當您打開瀏覽器時,您會看到提示輸入憑據。我的手機上有很多應用程序(例如網絡瀏覽器),在這種情況下無法使用。 我想使用移動網絡發送數據,但系統仍嘗試使用wi-fi。處理不活動的Wi-Fi網絡

NetworkInfo.isAvailable()NetworkInfo.isConnected()仍然返回true所描述的Wi-Fi網絡。 任何解決方案?

+0

是否有可能以簡單的ping像谷歌網站?如果在接入點後面會有一個登錄頁面,則通常會失敗,通常會失敗。 – Viezevingertjes 2012-08-20 09:05:17

+0

AFAIK ping很棘手。 – 2012-08-20 09:40:30

+0

這與http://stackoverflow.com/a/1085054/193892類似,但對於Android而言,則是Windows。如果它存在會很好。 – 2012-08-20 14:22:24

回答

1

試試這個....

我需要做一些定製的work..but得到它和運行...

我的代碼switches from Wifi to Mobile network當其關閉

,我使用了TimeService at port 37知道,互聯網是死的,而wifi連接仍然打開

/////////////////// ///////編輯//////////////////////////////////

現在我是把這裏放一個我做的complete working code。請原諒我作爲DRY(不要重複自己的原則)已被濫用在這裏。所以,請在生產網絡中使用時重構代碼,並轉換重複的代碼到方法,即到single sensible place

/////---------------------------Intial Available Network Checking 



private boolean checkConnection(){ 


boolean connected = false; 
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 

if (cm != null) { 
NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 

for (NetworkInfo ni : netInfo) { 
if ((ni.getTypeName().equalsIgnoreCase("WIFI") 
|| ni.getTypeName().equalsIgnoreCase("MOBILE")) 
& ni.isConnected() & ni.isAvailable()) { 
connected = true; 
    } 

    } 
} 


return connected; 

} ///// ----------- ---------------- INTIAL可用的網絡檢查

/////-------------------------------Check for the working Internet Connection 


public boolean inetAddr(){ 

    boolean x1 = false; 


    try { 
     Socket s = new Socket("utcnist.colorado.edu", 37); 

     InputStream i = s.getInputStream(); 

     Scanner scan = new Scanner(i); 

     while(scan.hasNextLine()){ 

      System.out.println(scan.nextLine()); 
      x1 = true; 
     } 
    } catch (Exception e) { 


      x1 = false; 
    } 

    return x1; 

} 

/////-------------------------------Check for the working Internet Connection 


////-------------------------------Check Mobile Conectivity Again 

public boolean mobileConnect(){ 

    boolean conn = false; 
    ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNet = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

    if(activeNet != null){ 

     conn = true; 
    }else{ 

     conn = false; 
    } 

    return conn; 



} 

////------------------------------Check Mobile Conectivity Again 

我在這裏使用上述方法....

try{  
    if (!checkConnection()){ 


     AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this); 
     myAlertDialog.setTitle("--- Connectivity Check ---"); 
     myAlertDialog.setMessage("No Internet Connectivity"); 
     myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

      public void onClick(DialogInterface arg0, int arg1) { 

      YumZingSplashActivity.this.finish(); 
      //splashHandler.removeCallbacks(launcherRunnable); 

      }}); 
      System.out.println("No Internet Connectivity"); 

      myAlertDialog.show();   




     } 
     else{ 


       if(inetAddr()){ 
      aphandle = APIHandling.getInstance(); 
      aphandle.xmlCreateSession(); 
      System.out.println("Net Connectivity is Present"); 
      DURATION = Integer.valueOf(getString(R.string.splash_duration)); 



      splashHandler = new Handler(); 

      // ================ Main Code of the Application 
      launcherRunnable = new Runnable() { 

       public void run() { 
        Intent i = new Intent(YumZingSplashActivity.this, YumZingTabHostActivity.class); 
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(i); 
        YumZingSplashActivity.this.finish(); 
       } 
      }; 
      if (DEBUG) 
      { 
       splashHandler.post(launcherRunnable); 
      } 
      else{ 


       splashHandler.postDelayed(launcherRunnable, DURATION); 
      } 

     } 
       else{ 

        if(mobileConnect()){ 


         if(inetAddr()){ 
         aphandle = APIHandling.getInstance(); 
         aphandle.xmlCreateSession(); 
         System.out.println("Net Connectivity is Present"); 
         DURATION = Integer.valueOf(getString(R.string.splash_duration)); 



         splashHandler = new Handler(); 

         // ================ Main Code of the Application 
         launcherRunnable = new Runnable() { 

          public void run() { 
           Intent i = new Intent(YumZingSplashActivity.this, YumZingTabHostActivity.class); 
           i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
           startActivity(i); 
           YumZingSplashActivity.this.finish(); 
          } 
         }; 
         if (DEBUG) 
         { 
          splashHandler.post(launcherRunnable); 
         } 
         else{ 


          splashHandler.postDelayed(launcherRunnable, DURATION); 
         } 
         }else{ 

          AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this); 
         myAlertDialog.setTitle("--- Connectivity Check ---"); 
         myAlertDialog.setMessage("No Internet Connectivity"); 
         myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

          public void onClick(DialogInterface arg0, int arg1) { 

          YumZingSplashActivity.this.finish(); 
          //splashHandler.removeCallbacks(launcherRunnable); 

          }}); 
          System.out.println("No Internet Connectivity"); 

          myAlertDialog.show();  
         } 
        }else{ 




         AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this); 
         myAlertDialog.setTitle("--- Connectivity Check ---"); 
         myAlertDialog.setMessage("No Internet Connectivity"); 
         myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

          public void onClick(DialogInterface arg0, int arg1) { 

          YumZingSplashActivity.this.finish(); 
          //splashHandler.removeCallbacks(launcherRunnable); 

          }}); 
          System.out.println("No Internet Connectivity"); 

          myAlertDialog.show();   






        } 

       } 
     } 

    //setContentView(R.layout.yumzing_splash_layout); 
    } catch(Exception ex){ 

      System.out.println("Leak ko catch"); 
     } 



    } 
+0

對於這些類型的網絡,ni.isConnected()將返回true。 – 2012-08-20 12:36:03

+0

謝謝,我來看看。 – 2012-08-20 12:43:36

+0

請看看我的編輯答案 – 2012-08-20 12:45:53

2

我一直有同樣的問題,我發現有沒有這種可能性通過Android SDK,你必須編寫自己的方式來做到這一點。

這取決於你想要對網絡做什麼以及你的意思是「不活躍」 - 你可以連接到一臺沒有連接到互聯網的路由器,並且沒有Android方法檢查這種情況。正如邁克爾先生寫的,ping是檢查它的一種方法,但在這種情況下,正面測試只會告訴您有關ping的信息 - 網絡可能有一些沉重的防火牆,允許您發送ping命令,但我。即不會讓HTTP請求通過。

在這種情況下,您必須根據自己的需求編寫自己的自定義測試,唉 - 這就是我所做的。我只是實現了簡單的類似ping的協議(我嘗試在適當的IP /端口上連接我的套接字併發送短消息等待簡短的回答)。只有這樣才能100%保證可以建立我想要的連接。

+1

」您可以連接到路由器,它沒有連接到互聯網「 - 正好 – 2012-08-20 10:41:41

+0

因此,如果這個[方法](http://stackoverflow.com/a/12136830/4385913)如果路由器沒有連接到互聯網,它會返回'true'?因爲主機不同於'url.getHost()'? – 2015-07-30 14:03:43

2

據我所知,沒有辦法強制通過wifi使用數據連接(可能是你不應該在沒有用戶交互的情況下進行的操作)。

我有很多我的應用程序相同的要求,我想知道他們是否有一個可行的網絡連接,同時啓動畫面加載中(例如我給一個只讀版本的應用程序,如果沒有)。

我解決這個獲得的方式是火一個簡單的服務調用我叫isAlive服務器剛剛返回真imedialtly。這不僅告訴我,我能夠看到我的服務,它也證實我的服務器是聯機的(在我的結尾沒有問題)。如果我沒有及時收到迴應,我通知用戶他們沒有網絡連接,並且「請在繼續之前確保您有有效的數據/無線網絡連接」。然後,我把isConnected屬性改爲wifi,並修改此消息以表示「您當前的無線連接不能訪問互聯網」或類似的東西。

不是你所希望的答案,但也許是一種可能性?

+0

謝謝,我會試試。 – 2012-08-20 12:33:44

+0

你如何檢查服務器isAlive?簡單的http請求? – 2012-08-20 12:36:49

+1

在我的情況下,這是一個打電話給我的web服務,硬編碼回覆TRUE。這樣,如果我無法打到服務,我知道這是錯誤的。但是,如果發生異常,則可以使用http請求假定爲false。 – melodiouscode 2012-08-20 12:55:22

2

只是一個建議:你可以嘗試使用requestRouteToHost()。但是首先要搜索使用這種方法的問題。

而且你需要的CHANGE_NETWORK_STATE許可。

1

你可以連接到WiFi網絡,嘗試連接到後臺的任何頁面,並確認是否有任何重定向。如果是這樣,它很可能是證書頁面。事實上,當我試圖找到如何實現剛剛描述的解決方案時,我發現它在Android開發人員站點的HttpURLConnection class documentation中進行了描述。在那裏,你可以閱讀:

處理網絡點登錄

一些Wi-Fi網絡禁止訪問Internet,直到用戶點擊通過一個登錄頁面。這種登錄頁面通常通過使用HTTP重定向來呈現。您可以使用getURL()來測試您的連接是否被意外重定向。只有在接收到響應標題後才能進行此項檢查,您可以通過撥打getHeaderFields()getInputStream()來觸發該響應標題。例如,要檢查一個響應並沒有重定向到一個意想不到的主機:

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
    try { 
    InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
    if (!url.getHost().equals(urlConnection.getURL().getHost())) { 
     // we were redirected! Kick the user out to the browser to sign on? 

    ... 
    } finally { 
    urlConnection.disconnect(); 
    } 
} 
0

嘗試

InetAddress.getByName(host).isReachable(timeOut)