假設手機找到打開的Wi-Fi網絡並連接到它。但是Wi-Fi網絡是「非活動」的,即當您打開瀏覽器時,您會看到提示輸入憑據。我的手機上有很多應用程序(例如網絡瀏覽器),在這種情況下無法使用。 我想使用移動網絡發送數據,但系統仍嘗試使用wi-fi。處理不活動的Wi-Fi網絡
NetworkInfo.isAvailable()
和NetworkInfo.isConnected()
仍然返回true
所描述的Wi-Fi網絡。 任何解決方案?
假設手機找到打開的Wi-Fi網絡並連接到它。但是Wi-Fi網絡是「非活動」的,即當您打開瀏覽器時,您會看到提示輸入憑據。我的手機上有很多應用程序(例如網絡瀏覽器),在這種情況下無法使用。 我想使用移動網絡發送數據,但系統仍嘗試使用wi-fi。處理不活動的Wi-Fi網絡
NetworkInfo.isAvailable()
和NetworkInfo.isConnected()
仍然返回true
所描述的Wi-Fi網絡。 任何解決方案?
試試這個....
我需要做一些定製的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");
}
}
對於這些類型的網絡,ni.isConnected()將返回true。 – 2012-08-20 12:36:03
謝謝,我來看看。 – 2012-08-20 12:43:36
請看看我的編輯答案 – 2012-08-20 12:45:53
我一直有同樣的問題,我發現有沒有這種可能性通過Android SDK,你必須編寫自己的方式來做到這一點。
這取決於你想要對網絡做什麼以及你的意思是「不活躍」 - 你可以連接到一臺沒有連接到互聯網的路由器,並且沒有Android方法檢查這種情況。正如邁克爾先生寫的,ping是檢查它的一種方法,但在這種情況下,正面測試只會告訴您有關ping的信息 - 網絡可能有一些沉重的防火牆,允許您發送ping命令,但我。即不會讓HTTP請求通過。
在這種情況下,您必須根據自己的需求編寫自己的自定義測試,唉 - 這就是我所做的。我只是實現了簡單的類似ping的協議(我嘗試在適當的IP /端口上連接我的套接字併發送短消息等待簡短的回答)。只有這樣才能100%保證可以建立我想要的連接。
」您可以連接到路由器,它沒有連接到互聯網「 - 正好 – 2012-08-20 10:41:41
因此,如果這個[方法](http://stackoverflow.com/a/12136830/4385913)如果路由器沒有連接到互聯網,它會返回'true'?因爲主機不同於'url.getHost()'? – 2015-07-30 14:03:43
據我所知,沒有辦法強制通過wifi使用數據連接(可能是你不應該在沒有用戶交互的情況下進行的操作)。
我有很多我的應用程序相同的要求,我想知道他們是否有一個可行的網絡連接,同時啓動畫面加載中(例如我給一個只讀版本的應用程序,如果沒有)。
我解決這個獲得的方式是火一個簡單的服務調用我叫isAlive
服務器剛剛返回真imedialtly。這不僅告訴我,我能夠看到我的服務,它也證實我的服務器是聯機的(在我的結尾沒有問題)。如果我沒有及時收到迴應,我通知用戶他們沒有網絡連接,並且「請在繼續之前確保您有有效的數據/無線網絡連接」。然後,我把isConnected
屬性改爲wifi,並修改此消息以表示「您當前的無線連接不能訪問互聯網」或類似的東西。
不是你所希望的答案,但也許是一種可能性?
謝謝,我會試試。 – 2012-08-20 12:33:44
你如何檢查服務器isAlive?簡單的http請求? – 2012-08-20 12:36:49
在我的情況下,這是一個打電話給我的web服務,硬編碼回覆TRUE。這樣,如果我無法打到服務,我知道這是錯誤的。但是,如果發生異常,則可以使用http請求假定爲false。 – melodiouscode 2012-08-20 12:55:22
只是一個建議:你可以嘗試使用requestRouteToHost()。但是首先要搜索使用這種方法的問題。
而且你需要的CHANGE_NETWORK_STATE
許可。
你可以連接到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();
}
}
嘗試
InetAddress.getByName(host).isReachable(timeOut)
是否有可能以簡單的ping像谷歌網站?如果在接入點後面會有一個登錄頁面,則通常會失敗,通常會失敗。 – Viezevingertjes 2012-08-20 09:05:17
AFAIK ping很棘手。 – 2012-08-20 09:40:30
這與http://stackoverflow.com/a/1085054/193892類似,但對於Android而言,則是Windows。如果它存在會很好。 – 2012-08-20 14:22:24