2013-07-23 33 views
5

Androidでネットワーク接続を検出する方法については、多くの質問があります。 https://stackoverflow.com/a/4239019/90236は非常に詳細な答えを提供し、https://stackoverflow.com/a/8548926/90236は、接続されているネットワークのタイプを識別する方法を示しています。Androidのネットワーク接続が制限されていますか?

私たちのようなものを答えのようなコードを使用してネットワーク接続を検出:

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

これは、彼らがオフラインの場合、私たちは、ユーザーに警告することができます。ただし、ユーザーの接続が制限されているかどうかはわかりません。接続が限られているためにユーザーが不平を言うような状況があります。

  1. ユーザーは家庭用Wi-Fiネットワークに接続されていますが、ケーブルモデムまたはインターネットサービスは利用できません。

  2. ユーザーはホテルや喫茶店にいて、Wi-Fiネットワークに正常に接続していますが、完全なネットワークアクセスが許可される前にログインまたは利用規約に同意する必要があります。

これらの状況では、isNetworkAvailable()テストはtrueを返します。 OSは私たちにネットワークに接続していることを伝えます。ただし、ユーザーはインターネットに接続することはできません。

ユーザーが完全に機能するネットワーク接続を持っているかどうかを判断する良い方法はありますか?

私は軽量のWebサービスを呼び出して接続性を確認し、サービスから有効な返品を受け取れない場合に警告します。これは過剰ですか?他の人に同様の技術に頼らざるを得なかったか?

答えて

8

ユーザーが完全に機能するネットワーク接続を持っているかどうかを判断する良い方法はありますか?

どこかからダウンロードしてみてください。理想的には、「どこか」は自分のサーバーで、デバイスとサーバー間の接続をテストします。

ああ、ConnectivityManagerにはdoesTehConnexionSuck()またはiCanHazBandwidth()のメソッドがありません。 :-)

これは過剰ですか?

"Goldilocks and the Three Bears"の精神で、私は正気であると説明します。

the same sorts of shenanigans in Web appsも行う必要があります。

+1

私は「justrightkill」のアイデアが好き、それはそれに同じリングを持っていない - http://www.youtube.com/watch?v=YjETcbEDmoQ –

+0

笑非常に面白い..... –

3

私が追加したコードを完成させてください。私はかなり一般的なHttpClientコードは、HTTP要求を行い、要求が成功したときにtrueを返すと思います。私は応答のエンティティに気にしないので、これは高速にする必要がありますので、私はHttpHeadを使用しました。このメソッドはConnectivityHelperというクラスにあり、DefaultSettingsは有用な定数の束を定義したクラスです。

public static boolean isNetworkAvailable() { 
    ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo; 

    try { 
     netInfo = manager.getActiveNetworkInfo(); 
    } catch (Exception e) { 
     netInfo = null; 
    } 

    return netInfo != null && netInfo.isConnected() && testConnection(DefaultSettings.TEST_CONNECTION_URL); 
} 


private static boolean testConnection(String url) { 
    HttpClient httpClient = null; 
    HttpHead request = null; 
    HttpResponse response = null; 
    int statusCode = 0; 

    try { 
     HttpParams myParams = new BasicHttpParams(); 
     HttpConnectionParams.setConnectionTimeout(myParams, DefaultSettings.CONNECTION_TIMEOUT); 
     HttpConnectionParams.setSoTimeout(myParams, DefaultSettings.SO_TIMEOUT); 

     httpClient = new DefaultHttpClient(myParams); 

     request = new HttpHead(url); 
     response = httpClient.execute(request); 
     statusCode = response.getStatusLine().getStatusCode(); 

     if (statusCode != 200) 
     { 
      Log.e(ConnectivityHelper.class.getName(), String.format("testConnection not successful. For %s - Status code = %d", url, statusCode)); 
      return false; 
     } 
     return true; 

    } catch(ClientProtocolException e) { 
     Log.e(ConnectivityHelper.class.getName(), String.format("testConnection failure. For %s - Exception: %s.", url, e.toString())); 

     if (request != null && !request.isAborted()) { 
      request.abort(); 
     } 

     return false; 
    } catch(IOException e) { 
     if (statusCode == 401) { 
      Log.e(ConnectivityHelper.class.getName(), String.format("testConnection access denied. For %s - Status code = %d", url, statusCode));    
     } else { 
      Log.e(ConnectivityHelper.class.getName(), String.format("testConnection failure. For %s - Exception: %s.", url, e.toString())); 
     } 

     if (request != null && !request.isAborted()) { 
      request.abort(); 
     } 

     return false; 
    } finally { 
     if (httpClient != null) { 
      httpClient.getConnectionManager().shutdown(); 
     } 
    }   
} 
+0

私はあなたの答えを受け入れたものとしてマークするべきだと思います。 – dentex

+0

私は上記のコードを書くようになったのは、@ CommonSWareによって投稿された回答だったので、彼の答えは最初であり、とても役に立ちました。残りは、彼らが言うように、ちょうど運動でした。 –

+0

フェア十分です。 :) – dentex

関連する問題