2012-09-15 11 views
5

このコードは常にtrueを返します。これはLoginボタンが押されると呼び出されます。私は最初にwifi接続(エミュレータ上)で試しました。それは本当に戻って、その後私は無線LANを切断してから試してみました。それでも真実を返します。インターネットが利用できない場合でも、Android networkinfoは常にtrueを返します。

public static boolean isNetworkAvailable(Context context) { 

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
      // if no network is available networkInfo will be null 
      // otherwise check if we are connected 
      if (networkInfo != null && networkInfo.isConnected()) { 
       State network = networkInfo.getState(); 
       Log.d("here", "true"); 
       return (network == NetworkInfo.State.CONNECTED || network == NetworkInfo.State.CONNECTING); 

      } 
      Log.d("here1", "false"); 
      return false; 
} 

答えて

14

このコードは、私のアプリケーションの中で非常によく似たものを使用しているため、オンデバイスで動作します。このコードでは、にネットワークに接続されているかどうかがわかります。接続しているネットワークにインターネット接続があるかどうかは関係ありません。エミュレータを使用している場合は、常に3Gシミュレーションで接続されているため、コンピュータのWi-Fiを切断してもそれは変わりません。エミュレータを飛行機モードにすると、あなたが探していた「偽」が得られます。

私のアプリで行ったことは、ネットワーク変更ブロードキャストを受信するサービスを作成することです。ネットワークが接続されると、インターネット上で既知の(小さな)ファイルをダウンロードしようとします。それが成功した場合にのみ、インターネット利用可能なインテントをすべてのアクティビティにブロードキャストし、これに基づいて状態を変更することができます。

+0

インターネットが利用可能かどうかを直接知る方法はありませんか? –

+0

ありません。問題は、ここでは「ネットワーク」が定義の問題であるということです。イントラネットにフルアクセスしてWi-Fiに接続することができます。これはアプリにとって大丈夫です。非常に制限の厳しいファイアウォールの背後に座って、たとえばwww.facebook.comをブロックして従業員の生産性を維持することもできます。 興味のあるサービス、または一般的なURLを明示的にチェックする必要があります。 私のConnectivityServiceはロケット科学ではありません。ちょっとした時間があれば、私はそれをきれいにして投稿します。おそらく月曜日より前です。 – 323go

+1

偉大な答え私はあなたが私が夢中になったので、それが合うときに私はあなたの答えを引用してください – shareef

関連する問題