0

実行時にアンドロイドでインターネット接続をチェックする際に問題があります。 私はいくつかの異なる方法を使ってインターネット接続をチェックしていますが、どれが良いか分かりません。それぞれにいくつかの問題があるからです。アンドロイドでインターネット接続を確認する(ネットワーク接続ではない)

方法1 グーグルをping によるチェックインターネット接続:

Runtime runtime = Runtime.getRuntime(); 
try { 
     Process mIpAddressProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8"); 
     int mExitValue = mIpAddressProcess.waitFor(); 
     return mExitValue == 0; 
} catch (InterruptedException | IOException ignore) { 
      ignore.printStackTrace(); 
} 

方法2 ConnectivityManagerによるチェックインターネット接続:

public boolean checkNetwork() { 

    ConnectivityManager internetManager = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = internetManager.getActiveNetworkInfo(); 
    return (networkInfo != null && networkInfo.isConnected() && networkInfo.isAvailable() && networkInfo.isConnectedOrConnecting()); 

} 

私は方法1を非同期タスク内で使用しますが、正しく動作しない場合があります。 と方法2(ConnectivityManager)はインターネット接続をチェックしません。ネットワーク接続のみをチェックします。

+1

あなたは 'Aynch task'の代わりに' handler'を使うことができます...それは別のスレッドで動くのでUIは乱されません...非常に遅い場合でもハンドラを停止することができます – rafsanahmad007

答えて

3

私は毎回接続を確認するためにブロードキャストを使用しています。接続情報のクラスを作成します。

import android.content.Context; 
import android.content.ContextWrapper; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 


public class ConnectivityStatus extends ContextWrapper{ 

    public ConnectivityStatus(Context base) { 
     super(base); 
    } 

    public static boolean isConnected(Context context){ 

     ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo connection = manager.getActiveNetworkInfo(); 
     if (connection != null && connection.isConnectedOrConnecting()){ 
      return true; 
     } 
     return false; 
    } 
} 

あなたの活動にコードを適用します。

private BroadcastReceiver receiver = new BroadcastReceiver() { 
@Override 
public void onReceive(Context context, Intent intent) { 
     if(!ConnectivityStatus.isConnected(getContext())){ 
      // no connection 
     }else { 
      // connected 
     } 
    } 
}; 

あなたの活動のonCreate()方法で放送登録:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.your_layout); 
    your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 
    .. 
    ... 
    .... 
    } 

が未登録に忘れないでください/活動サイクルに登録:

@Override 
protected void onResume() { 
    super.onResume(); 
    your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 

} 

@Override 
protected void onPause() { 
    super.onPause(); 
    your_activity_context.unregisterReceiver(receiver); 

} 
+0

私はすでにこのメソッドを使用していますが、インターネット接続をチェックしていない、それはネットワーク接続をチェックするだけです! – mirjafarabedi

+0

私は 'BroadCastReciever' fot constant network infoを使って2つの新しいオプションを使って自分の答えを更新しました。 – W4R10CK

0
public static boolean isNetworkAvailable(Context context) { 
    try { 
     ConnectivityManager connManager = (ConnectivityManager) context.getSystemService 
       (Context.CONNECTIVITY_SERVICE); 
     if (connManager.getActiveNetworkInfo() != null && connManager.getActiveNetworkInfo() 
       .isAvailable() && connManager.getActiveNetworkInfo().isConnected()) { 
      return true; 
     } 
    } catch (Exception ex) { 

     ex.printStackTrace(); 
     return false; 
    } 
    return false; 
} 

その後、ちょうどあなたは以下のコードを使用することができ、インターネット接続が利用可能であるかどうかを確認するには

0

に動作しますあなたのfragmentActivityからこの関数を呼び出す

public static boolean hasActiveInternetConnection(Context context) { 
    if (isNetworkAvailable(context)) { 
     try { 
      HttpURLConnection urlc = (HttpURLConnection) 
        (new URL("http://clients3.google.com/generate_204") 
        .openConnection()); 
      urlc.setRequestProperty("User-Agent", "Android"); 
      urlc.setRequestProperty("Connection", "close"); 
      urlc.setConnectTimeout(1500); 
      urlc.connect(); 
      return (urlc.getResponseCode() == 204 && urlc.getContentLength() == 0); 
     } catch (IOException e) { 
      Log.e(LOG_TAG, "Error checking internet connection", e); 
     } 
    } else { 
     Log.d(LOG_TAG, "No network available!"); 
    } 
    return false; 
} 

このコードスニペットにも役立ちますWi-Fiネットワーク経由で接続されていても、デバイスがインターネットに接続しているかどうかを確認できます。

注:これはネットワークの速度に応じて、時間がかかることがあり、

2

メインスレッドで呼び出されるべきではありませんので、バックグラウンドスレッドでこのメソッドを呼び出してくださいただ、ここでは、このLINK をチェックすると答えています両方の接続のために&インターネット。あなたはこの

ようにそれを行うことができます

2

は、Androidの許可使用しています:名= "android.permission:名前は= "android.permission.INTERNETあなた"

は、Androidの許可使用しています。ACCESS_NETWORK_STATE」あなたはネットワーク接続が利用可能であるかどうかをチェックするためのコードの下に使用することができます

private boolean checkInternet(Context context) { 
    // get Connectivity Manager object to check connection 
    ConnectivityManager connec 
      =(ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE); 

    // Check for network connections 
    if (connec.getNetworkInfo(0).getState() == 
      android.net.NetworkInfo.State.CONNECTED || 
      connec.getNetworkInfo(0).getState() == 
        android.net.NetworkInfo.State.CONNECTING || 
      connec.getNetworkInfo(1).getState() == 
        android.net.NetworkInfo.State.CONNECTING || 
      connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTED) { 
     Toast.makeText(context, " Connected ", Toast.LENGTH_LONG).show(); 
     return true; 
    }else if (
      connec.getNetworkInfo(0).getState() == 
        android.net.NetworkInfo.State.DISCONNECTED || 
        connec.getNetworkInfo(1).getState() == 
          android.net.NetworkInfo.State.DISCONNECTED ) { 
     Toast.makeText(context, " Not Connected ", Toast.LENGTH_LONG).show(); 
     return false; 
    } 
    return false; 
} 
3

public class NetworkConnection { 
    public Context context; 

    public NetworkConnection(Context applicationContext) { 
     this.context=applicationContext; 
    } 

    public boolean isOnline() { 
     ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
     if (netInfo != null && netInfo.isConnectedOrConnecting()) { 
      return true; 
     } 
     return false; 
    } 
} 

public class MainActivity extends AppCompatActivity { 
    NetworkConnection nt_check; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     nt_check=new NetworkConnection(context); 
     if(nt_check.isOnline()) { 
      // do logic 
     } else { 
      // show message network is not available. 
     } 
    } 
} 
0

これは、私はそれがインターネット接続を確認するには、Androidにしようとするものです洗練されたソリューションではありませんが、与えられた作業はが既にネットワークでチェックされています

try { 
     HttpURLConnection urlConnection = (HttpURLConnection) 
     (new URL("http://clients3.google.com/generate_204") 
     .openConnection()); 
     urlConnection.setRequestProperty("User-Agent", "Android"); 
     urlConnection.setRequestProperty("Connection", "close"); 
     urlConnection.setConnectTimeout(1500); 
     urlConnection.connect(); 
     if (urlConnection.getResponseCode() == 204 && 
     urlConnection.getContentLength() == 0) { 
     Log.d("Network Checker", "Successfully connected to internet"); 
     return true; 
     } 
     } catch (IOException e) { 
     Log.e("Network Checker", "Error checking internet connection", e); 
     } 

それはme.Tryため正確だとあなたが他の良い解決策を見つけた場合、私に知らせてください。

関連する問題