web-dev-qa-db-ja.com

アクティブなインターネット接続を確認してくださいAndroid

アクティブなWi-Fi接続と実際のインターネット接続を区別する部分をアプリに書き込もうとしています。アクティブなWifi接続があるかどうかを確認するのは、接続マネージャーを使用すると非常に簡単ですが、Wifiが接続されているときにウェブサイトに接続できるかどうかをテストしようとするたびに、インターネット接続がないため、無限ループに陥ります。
私はグーグルにpingを試みましたが、これは同じように終わります:

Process p1 = Java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = 5;
try {
    returnVal = p1.waitFor();
} catch (InterruptedException e) {
    e.printStackTrace();
}
boolean reachable = (returnVal==0);
return reachable;

私もこのコードを試しました:

if (InetAddress.getByName("www.xy.com").isReachable(timeout))
{    }
else
{    }

しかし、isReachableを機能させることができませんでした。

12
user1528944

それは私のために働きます:

ネットワークの可用性を確認するには:

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

インターネットアクセスを確認するには:

public Boolean isOnline() {
    try {
        Process p1 = Java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
        int returnVal = p1.waitFor();
        boolean reachable = (returnVal==0);
        return reachable;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return false;
}
25
Musculaa

私はこれを使用します:

public static void isNetworkAvailable(Context context){
    HttpGet httpGet = new HttpGet("http://www.google.com");
    HttpParams httpParameters = new BasicHttpParams();
    // Set the timeout in milliseconds until a connection is established.
    // The default value is zero, that means the timeout is not used.
    int timeoutConnection = 3000;
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
    // Set the default socket timeout (SO_TIMEOUT)
    // in milliseconds which is the timeout for waiting for data.
    int timeoutSocket = 5000;
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

    DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
    try{
        Log.d(TAG, "Checking network connection...");
        httpClient.execute(httpGet);
        Log.d(TAG, "Connection OK");
        return;
    }
    catch(ClientProtocolException e){
        e.printStackTrace();
    }
    catch(IOException e){
        e.printStackTrace();
    }

    Log.d(TAG, "Connection unavailable");
}

それは他のstackoverflowの答えから来ていますが、私はそれを見つけることができません。

編集:

ついに私はそれを見つけました: https://stackoverflow.com/a/1565243/2198638

10
Brtle

Androidデバイスがアクティブな接続を持っているかどうかを確認するには、以下のhasActiveInternetConnection()メソッドを使用します。その下で、(1)ネットワークが利用可能かどうかを検出し、(2)google.comに接続します。ネットワークがアクティブかどうかを判断します。

public static boolean hasActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
        if (connectGoogle()) {
            return true;
        } else { //one more try
            return connectGoogle();
        }   
    } else {
        log("No network available! (in hasActiveInternetConnection())");
        return false;
    }
}


public static boolean isNetworkAvailable(Context ct) {
    ConnectivityManager connectivityManager = (ConnectivityManager) ct.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null;
}


public static boolean connectGoogle() {
    try {
        HttpURLConnection urlc = (HttpURLConnection)(new URL("http://www.google.com").openConnection());
        urlc.setRequestProperty("User-Agent", "Test");
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(10000); 
        urlc.connect();
        return (urlc.getResponseCode() == 200);     
    } catch (IOException e) {
        log("IOException in connectGoogle())");
        return false;
    }
}
4
sreejin

これは、AsynTaskを使用して、メインスレッドに接続しようとするとAndroidがクラッシュし、すすぎと繰り返しのオプションを含むアラートが発生する)を回避する最新のコードです。ユーザーのために。

class TestInternet extends AsyncTask<Void, Void, Boolean> {
    @Override
    protected Boolean doInBackground(Void... params) {
        try {
            URL url = new URL("http://www.google.com");
            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setConnectTimeout(3000);
            urlc.connect();
            if (urlc.getResponseCode() == 200) {
                return true;
            }
        } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            return false;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
        return false;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        if (!result) { // code if not connected
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setMessage("An internet connection is required.");
            builder.setCancelable(false);

            builder.setPositiveButton(
                    "TRY AGAIN",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                            new TestInternet().execute();
                        }
                    });


            AlertDialog alert11 = builder.create();
            alert11.show();
        } else { // code if connected
            doMyStuff();
        }
    }
}

.。

new TestInternet().execute();
3

次のようなWebサイトをクエリします。

次のメソッドをクラスに追加して、クラスにAsyncTaskCompleteListenere<Boolean>を実装させます。

@Override
public void onTaskComplete(Boolean result) {
    Toast.makeText(getApplicationContext(), "URL Exist:" + result, Toast.LENGTH_LONG).show();
   // continue your job
}

接続を確認するときに呼び出される単純なtestConnectionメソッドをクラスに追加します。

public void testConnection() {
        URLExistAsyncTask task = new URLExistAsyncTask(this);
        String URL = "http://www.google.com";
        task.execute(new String[]{URL});
    }

そして最後に、非同期(バックグラウンド)タスクとして接続テストを実行し、完了したらURLExistAsyncTaskメソッドをコールバックするonTaskCompleteクラス:

  public class URLExistAsyncTask extends AsyncTask<String, Void, Boolean> {
        AsyncTaskCompleteListenere<Boolean> callback;

        public URLExistAsyncTask(AsyncTaskCompleteListenere<Boolean> callback) {
            this.callback = callback;
        }

        protected Boolean doInBackground(String... params) {
            int code = 0;
            try {
                URL u = new URL(params[0]);
                HttpURLConnection huc = (HttpURLConnection) u.openConnection();
                huc.setRequestMethod("GET");
                huc.connect();
                code = huc.getResponseCode();
            } catch (IOException e) {
                return false;
            } catch (Exception e) {
                return false;
            }

            return code == 200;
        }

        protected void onPostExecute(Boolean result){
              callback.onTaskComplete(result);
        }
    }
2
Mohsen Afshin

私はこの方法を使用しました。それは私のために働いた!本物のインターネットを手に入れたい人のために!

public boolean isOnline() {
    try {
        HttpURLConnection httpURLConnection = (HttpURLConnection)(new URL("http://www.google.com").openConnection());
        httpURLConnection.setRequestProperty("User-Agent", "Test");
        httpURLConnection.setRequestProperty("Connection", "close");
        httpURLConnection.setConnectTimeout(10000);
        httpURLConnection.connect();
        return (httpURLConnection.getResponseCode() == 200);
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}

毎回このメソッドを実行するために!レシーバーを使用して=>

httpURLConnection.getResponseCode() == 200 

これはインターネットが接続されていることを意味します!

0
Hadi Note

あなたは時間を数えるnew parallel threadを作成することによってそれを行うことができます:

final class QueryClass {
    private int responseCode = -1;
     private   String makeHttpRequest(URL url) throws IOException {
            String jsonResponse = "";
            if(url == null) {
                return null;
            }

            HttpURLConnection  urlConnection = null;
            InputStream inputStream = null;
            try {
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.setReadTimeout(5000 );
                urlConnection.setConnectTimeout(5000 );
                Thread thread = new Thread() {
                    @Override
                    public void run() {
                        super.run();
                        try {
                            sleep(5000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        if(responseCode == -1) {
                            //Perform error message
                        Intent intent = new Intent(context,ErrorsActivity.class);
                        intent.putExtra("errorTextMessage",R.string.errorNoInternet);
                        intent.putExtra("errorImage",R.drawable.no_wifi);
                        context.startActivity(intent);
                        }
                    }
                };
                thread.start();
                urlConnection.connect();
                 responseCode = urlConnection.getResponseCode();
                if (responseCode == 200) {
                    inputStream = urlConnection.getInputStream();
                    jsonResponse = readFromStream(inputStream);

                }
0
Ahmed KHABER