Check for Active internet connection Android

前端 未结 7 1567
不知归路
不知归路 2020-11-27 05:26

I am trying to write a part in my app that will differentiate between an Active Wifi connection and an actual connection to the internet. Finding out if there is an active

相关标签:
7条回答
  • 2020-11-27 05:31

    To check if the android device is having an active connection, I use this hasActiveInternetConnection() method below that (1) tries to detect if network is available and (2) then connect to google.com to determine whether the network is active.

    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;
        }
    }
    
    0 讨论(0)
  • 2020-11-27 05:37

    I did use this method. It worked for me! For people who want to get the real Internet!

    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;
        }
    }
    

    For doing this method every time! Just use a receiver and =>

    httpURLConnection.getResponseCode() == 200 
    

    This means the Internet is connected!

    0 讨论(0)
  • 2020-11-27 05:39

    It does works for me:

    To verify network availability:

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

    To verify internet access:

    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;
    }
    
    0 讨论(0)
  • 2020-11-27 05:39

    Here is some modern code that uses an AsynTask to get around an issue where android crashes when you try and connect on the main thread and introduces an alert with a rinse and repeat option for the user.

    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();
    
    0 讨论(0)
  • 2020-11-27 05:41

    I use this:

    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");
    }
    

    It comes from an other stackoverflow answer but I can't find it.

    EDIT:

    Finally I found it: https://stackoverflow.com/a/1565243/2198638

    0 讨论(0)
  • 2020-11-27 05:42

    You can do it by create new parallel thread that count time :

    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 讨论(0)
提交回复
热议问题