Проверьте подключение к Интернету в Android (не подключение к сети)

У меня проблема с проверкой интернет-соединения в android во время выполнения. Я использую несколько разных методов для проверки подключения к Интернету, но не знаю, какой из них лучше. потому что у каждого из них есть проблемы.

Метод 1: проверьте подключение к Интернету, отправив запрос на проверку связи с Google:

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 внутри задачи async, но он иногда работает некорректно и замедляет работу приложения, а метод 2 (ConnectivityManager) не проверяет подключение к Интернету, он проверяет только подключение к сети!


person mirjafarabedi    schedule 09.01.2017    source источник
comment
вы можете использовать handler вместо _2 _... он работает в отдельном потоке, поэтому пользовательский интерфейс не нарушается ... также вы можете остановить обработчик, если он очень медленный   -  person rafsanahmad007    schedule 09.01.2017


Ответы (7)


Я использую широковещательную рассылку, чтобы каждый раз проверять соединение. Создайте класс для информации о подключении.

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

}
person W4R10CK    schedule 09.01.2017
comment
Я уже использую этот метод, но он не проверяет подключение к Интернету, он проверяет только подключение к сети! - person mirjafarabedi; 09.01.2017
comment
Я обновил свой ответ двумя новыми вариантами, используя BroadCastReciever fot постоянную информацию о сети. - person W4R10CK; 09.01.2017
comment
Здесь действительно нет смысла расширять ContextWrapper. - person Paul Woitaschek; 13.09.2018
comment
@PaulWoitaschek, Да, я верю в это, и это был экспериментальный код. - person W4R10CK; 14.09.2018
comment
Есть люди, которые скопируют ваш экспериментальный код и сделают его рабочим кодом;) - person Paul Woitaschek; 14.09.2018

Вы можете использовать приведенный ниже код, чтобы проверить, доступно ли сетевое соединение.

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.
        }
    }
}
person saiRam89    schedule 09.01.2017

Просто проверьте эту ССЫЛКУ Вот ответ как для подключения, так и для Интернета.

person Ashish Gupta    schedule 09.01.2017

Вы можете сделать это так

использует-разрешение android: name = "android.permission.INTERNET"

использует-разрешение android: name = "android.permission.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;
}
person Sunil Chaudhary    schedule 09.01.2017

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

тогда просто вызовите эту функцию из своего fragment или Activity будет работать

person eLemEnt    schedule 09.01.2017

Чтобы проверить, доступно ли подключение к Интернету, вы можете использовать приведенный ниже фрагмент кода.

    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.

Примечание. Обязательно вызывайте этот метод в фоновом потоке, потому что это может занять время, в зависимости от скорости вашей сети, и его не следует вызывать в основном потоке.

person Hasif Seyd    schedule 09.01.2017

Это то, что я пытаюсь проверить в 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);
      }

Для меня это точное. Попытайтесь сообщить мне, если найдете другое хорошее решение.

person Piyush    schedule 09.01.2017