Как проверить, доступно ли интернет-соединение в настоящее время или нет в Android

Я также хочу выполнить свое приложение в автономном режиме, поэтому мне нужно проверить, доступно ли в настоящее время подключение к Интернету или нет. Кто-нибудь может сказать мне, как проверить, доступен ли интернет или нет в Android? Дайте пример кода. Я пробовал с кодом ниже и проверял с помощью эмулятора, но он не работает

public  boolean isInternetConnection() 
{ 

    ConnectivityManager connectivityManager =  (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting(); 
} 

Спасибо


person mohan    schedule 29.03.2011    source источник


Ответы (18)


Это скажет, подключены ли вы к сети:

boolean connected = false;
ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || 
            connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
        //we are connected to a network
        connected = true;
    }
    else
        connected = false;

Предупреждение. Если вы подключены к сети Wi-Fi, которая не включает доступ в Интернет или требует аутентификации на основе браузера, connected все равно будет верно.

Вам понадобится это разрешение в вашем манифесте:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
person james    schedule 29.03.2011
comment
Привет. я использовал тот же код в своем приложении на ОС Android 4.0. но это дает исключение нулевого указателя. - person Vijay Bagul; 11.05.2012
comment
возможно, ваше устройство Android 4.0 не имеет подключения type_mobile - person arnodenhond; 10.06.2012
comment
Кстати, вы также должны проверить connectionManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) != null, или вы можете получить NullPointer на некоторых планшетах - person uncle Lem; 12.02.2013
comment
в ConnectivityManagerconnectionManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); в этой строке я получаю сообщение об ошибке, поэтому я изменил его на Context ctx=this; ConnectivityManagerconnectionManager = (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE); и это работает - person Rohan Pawar; 12.04.2013
comment
Документацию по Android читайте здесь developer.android.com/reference/android/net/ показывает, что описанное выше использование getNetworkInfo устарело, но метод все еще существует с другим параметром (сеть, а не целое число) - person Fat Monk; 07.01.2016
comment
else часть не требуется - person suvojit_007; 28.01.2019
comment
Устаревшее решение - person Mkr; 21.07.2020

Кроме того, имейте в виду, что иногда пользователь будет подключен к сети Wi-Fi, но для этой сети может потребоваться проверка подлинности на основе браузера. Таковы большинство точек доступа в аэропортах и ​​отелях, поэтому ваше приложение может быть обмануто, думая, что у вас есть подключение, и тогда любые выборки URL-адресов фактически будут получать страницу входа в точку доступа вместо страницы, которую вы ищете.

В зависимости от важности выполнения этой проверки, в дополнение к проверке соединения с ConnectivityManager, я бы предложил включить код для проверки того, что это работающее подключение к Интернету, а не просто иллюзия. Вы можете сделать это, попытавшись получить известный адрес/ресурс с вашего сайта, например изображение PNG размером 1x1 или текстовый файл размером 1 байт.

person Bruno Oliveira    schedule 29.03.2011
comment
Спасибо за пост и добро пожаловать в Stackoverflow. Как FYI, вы не должны включать подпись в свои сообщения здесь. - person dave.c; 29.03.2011

Вы можете использовать два метода:

1 - для проверки соединения:

   private boolean isNetworkConnected() {
        ConnectivityManager cm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo() != null;
    }

2 - для проверки интернета:

  public boolean internetIsConnected() {
        try {
            String command = "ping -c 1 google.com";
            return (Runtime.getRuntime().exec(command).waitFor() == 0);
        } catch (Exception e) {
            return false;
        }
    }

Добавьте разрешения на манифест:

 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
person Masoud Siahkali    schedule 05.08.2018
comment
Искал второй, чтобы проверить, доступен ли интернет или нет. Спасибо. - person Muhammad Rafique; 20.01.2020
comment
Я протестировал версию 2 с симулятором (API 24, разрешения есть), но она не работает: есть подключение к сети/интернету, но код зависает приложение (поэтому НЕ запускайте это в основном потоке!), а затем возвращает false примерно через 10 секунд (без исключения). Я пропустил что-нибудь, что необходимо, чтобы сделать эту работу? - person Neph; 25.03.2020

Используйте приведенный ниже код:

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

если isNetworkAvailable() возвращает true, то подключение к Интернету доступно, в противном случае подключение к Интернету недоступно

Здесь необходимо добавить ниже uses-permission в файл Manifest вашего приложения.

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
person sandeepmaaram    schedule 17.10.2013

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

Google рекомендует этот блок кода для проверки интернет-соединения. Потому что устройство может не иметь подключения к Интернету, даже если оно подключено к WiFi.

person N Droidev    schedule 27.06.2018

Вы можете просто попытаться установить TCP-соединение с удаленным хостом:

public boolean hostAvailable(String host, int port) {
  try (Socket socket = new Socket()) {
    socket.connect(new InetSocketAddress(host, port), 2000);
    return true;
  } catch (IOException e) {
    // Either we have a timeout or unreachable host or failed DNS lookup
    System.out.println(e);
    return false;
  }
}

Потом:

boolean online = hostAvailable("www.google.com", 80);
person Xiv    schedule 26.02.2016
comment
Для этого подхода требуется уровень API 19. - person Nagaraj Alagusundaram; 26.02.2018

Устарело в API 29.

getActiveNetworkInfo устарел в API 29. Поэтому мы можем использовать его ниже 29.

Новый код в Kotlin для всех API

fun isNetworkAvailable(context: Context): Boolean {
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
   
    // For 29 api or above
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) ?: return false
        return when {
            capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ->    true
            capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) ->   true
            capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ->   true
            else ->     false
         }
    }
    // For below 29 api
    else {
        if (connectivityManager.activeNetworkInfo != null && connectivityManager.activeNetworkInfo!!.isConnectedOrConnecting) {
            return true
        }
    }
    return false
}
person Sanjayrajsinh    schedule 29.03.2020

используйте следующий код:

public static boolean isNetworkAvaliable(Context ctx) {
    ConnectivityManager connectivityManager = (ConnectivityManager) ctx
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if ((connectivityManager
            .getNetworkInfo(ConnectivityManager.TYPE_MOBILE) != null && connectivityManager
            .getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED)
            || (connectivityManager
                    .getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null && connectivityManager
                    .getNetworkInfo(ConnectivityManager.TYPE_WIFI)
                    .getState() == NetworkInfo.State.CONNECTED)) {
        return true;
    } else {
        return false;
    }
}

помните, что вам нужно поместить в свой манифест следующую строку:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
person ogranada    schedule 21.11.2013

Код :

    fun isInternetConnection(): Boolean {
    var returnVal = false
    thread {
        returnVal = try {
            khttp.get("https://www.google.com/")
            true
        }catch (e:Exception){
            false
        }
    }.join()
    return returnVal
}

Грейдл:

implementation 'io.karn:khttp-android:0.1.0'

Я использую https://khttp.readthedocs.io/en/latest/, потому что им очень легко пользоваться.

Итак, здесь, в приведенном выше коде, если он успешно подключается к google.com, он возвращает true, иначе false.

person Sumanth Perambuduri    schedule 01.06.2021

попробуйте использовать ConnectivityManager

ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivity != null) {
        NetworkInfo[] info = connectivity.getAllNetworkInfo();
        if (info != null) {
            for (int i = 0; i < info.length; i++) {
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
    }
 return false

Также добавьте разрешение на AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
person Amol Desai    schedule 26.02.2016

Используйте метод checkConnectivity:

  if (checkConnectivity()){
    //do something 

    }

Способ проверки подключения:

private boolean checkConnectivity() {
        boolean enabled = true;

        ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = connectivityManager.getActiveNetworkInfo();

        if ((info == null || !info.isConnected() || !info.isAvailable())) {
                            Toast.makeText(getApplicationContext(), "Sin conexión a Internet...", Toast.LENGTH_SHORT).show();
            return false;
        } else {
            return true;
        }

        return false;
    }
person Cristofer    schedule 20.04.2016

Эта функция работает нормально...

public void checkConnection()
    {
        ConnectivityManager connectivityManager=(ConnectivityManager)

                this.getSystemService(Context.CONNECTIVITY_SERVICE);


  NetworkInfo wifi=connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);


 NetworkInfo  network=connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);


        if (wifi.isConnected())
        {
           //Internet available

        }
        else if(network.isConnected())
        {
             //Internet available


        }
        else
        {
             //Internet is not available
        }
    }

Добавьте разрешение в AndroidManifest.xml.

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
person Mir Rahed Uddin    schedule 15.01.2020

При отсутствии подключения к сети появится диалоговое окно с ошибкой.

    ConnectivityManager connMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

    if (networkInfo != null && networkInfo.isConnected()) {
        // fetch data
    } else {
        new AlertDialog.Builder(this)
            .setTitle("Connection Failure")
            .setMessage("Please Connect to the Internet")
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                }
            })
            .setIcon(android.R.drawable.ic_dialog_alert)
            .show();
    }
person Malith Ileperuma    schedule 27.03.2020

Вы можете попробовать это:

private boolean isConnectedToWifi(){
    ConnectivityManager cm = (ConnectivityManager) getApplication().getSystemService(Context.CONNECTIVITY_SERVICE);
    if(cm != null){    
        NetworkCapabilities nc = cm.getNetworkCapabilities(cm.getActiveNetwork());
        return nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
    }
    return false;
}
person Sourav    schedule 25.01.2021

Используйте службу ConnectivityManager

Источник Ссылка

...
...
import android.net.ConnectivityManager;
....
....
public class Utils {

   static ConnectivityManager connectivityManager;
   ....
   ....

    public static String isOnline(Context context) {
        JSONArray array = new JSONArray();
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("connected","false");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        try {
            connectivityManager = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            Log.i("networkInfo", networkInfo.toString());
            jsonObject.put("connected",(networkInfo != null && networkInfo.isAvailable() &&
                    networkInfo.isConnected()));
            jsonObject.put("isAvailable",(networkInfo.isAvailable()));
            jsonObject.put("isConnected",(networkInfo.isConnected()));
            jsonObject.put("typeName",(networkInfo.getTypeName()));
            array.put(jsonObject);
            return array.toString();


        } catch (Exception e) {
            System.out.println("CheckConnectivity Exception: " + e.getMessage());
            Log.v("connectivity", e.toString());
        }
        array.put(jsonObject);
        return array.toString();
    }

}
person Code Spy    schedule 20.12.2018

Этот код для проверки доступности сети для всех версий Android, включая Android 9.0 и выше:

public static boolean isNetworkConnected(Context  context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo();
    // For 29 api or above
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) ||
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
    } else return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

Не забудьте добавить разрешение состояния сети в свой манифест.

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Кроме того, добавьте @SuppressWarnings(deprecation) перед методом, чтобы избежать предупреждения об устаревании студии Android.

person Abdullah Alialdin    schedule 11.12.2020

Вот метод, который вы можете использовать. Это работает во всех API.

    public boolean isConnected() {
        ConnectivityManager cm = (ConnectivityManager) AnkiDroidApp.getInstance().getApplicationContext()
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (cm == null) {
            return false;
        }
        /* NetworkInfo is deprecated in API 29 so we have to check separately for higher API Levels */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            Network network = cm.getActiveNetwork();
            if (network == null) {
                return false;
            }
            NetworkCapabilities networkCapabilities = cm.getNetworkCapabilities(network);
            if (networkCapabilities == null) {
                return false;
            }
            boolean isInternetSuspended = !networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED);
            return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                    && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
                    && !isInternetSuspended;
        } else {
            NetworkInfo networkInfo = cm.getActiveNetworkInfo();
            return networkInfo != null && networkInfo.isConnected();
        }
    }
person Mrudul Tora    schedule 07.04.2021

person    schedule
comment
Это на самом деле не отличается от принятого ответа. Кроме того, isInternetConnection вводит в заблуждение, поскольку устройство может быть подключено к сети без Интернета, и в этом случае функция вернет true. - person Spikatrix; 06.03.2019