networking индикатор наличия - Как проверить доступ в Интернет на Android? InetAddress никогда не выбегает





15 Answers

Если устройство находится в режиме самолета (или, предположительно, в других ситуациях, когда нет доступной сети), cm.getActiveNetworkInfo() будет null , поэтому вам нужно добавить null проверку.

Изменено ( решение Эдди ) ниже:

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

Также добавьте следующие разрешения для AndroidManifest.xml :

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

Еще одна небольшая точка, если вам абсолютно необходимо подключение к сети в данный момент времени, тогда было бы лучше использовать netInfo.isConnected() а не netInfo.isConnectedOrConnecting . Я предполагаю, что это зависит от конкретного случая использования.

интернета андроид проверка

У меня есть AsyncTask который должен проверять сетевой доступ к имени хоста. Но doInBackground() никогда не doInBackground() . Кто-нибудь знает?

public class HostAvailabilityTask extends AsyncTask<String, Void, Boolean> {

    private Main main;

    public HostAvailabilityTask(Main main) {
        this.main = main;
    }

    protected Boolean doInBackground(String... params) {
        Main.Log("doInBackground() isHostAvailable():"+params[0]);

        try {
            return InetAddress.getByName(params[0]).isReachable(30); 
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;       
    }

    protected void onPostExecute(Boolean... result) {
        Main.Log("onPostExecute()");

        if(result[0] == false) {
            main.setContentView(R.layout.splash);
            return;
        }

        main.continueAfterHostCheck();
    }   
}



Чтобы получить getActiveNetworkInfo() для работы, вам нужно добавить в манифест следующее.

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



Взгляните на класс ConnectivityManager. Вы можете использовать этот класс для получения информации об активных соединениях на хосте. http://developer.android.com/reference/android/net/ConnectivityManager.html

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

Context.getSystemService(Context.CONNECTIVITY_SERVICE)
    .getNetworkInfo(ConnectivityManager.TYPE_MOBILE) 

или же

Context.getSystemService(Context.CONNECTIVITY_SERVICE)
    .getNetworkInfo(ConnectivityManager.TYPE_WIFI) 

и проанализируйте перечисление DetailedState возвращаемого объекта NetworkInfo

EDIT EDIT: чтобы узнать, можете ли вы получить доступ к хосту, вы можете использовать

Context.getSystemService(Context.CONNECTIVITY_SERVICE)
    .requestRouteToHost(TYPE_WIFI, int hostAddress)

Очевидно, что я использую Context.getSystemService (Context.CONNECTIVITY_SERVICE) в качестве прокси-сервера

ConnectivityManager cm = Context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.yourMethodCallHere();



Я сделал этот код, он самый простой, и он просто логический. задав вопрос if(isOnline()){

Вы получаете, если есть соединение, и если он может подключиться к странице, код состояния 200 (стабильное соединение).

Обязательно добавьте правильные разрешения INTERNET и ACCESS_NETWORK_STATE .

public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnected()) {
        try {
            URL url = new URL("http://www.google.com");
            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setConnectTimeout(3000);
            urlc.connect();
            if (urlc.getResponseCode() == 200) {
                return new Boolean(true);
            }
        } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return false;
}



Из всего, что я видел до сих пор, самый короткий и самый чистый путь должен быть:

public final static boolean isConnected( Context context )
{   
   final ConnectivityManager connectivityManager = 
         (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );  
   final NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();    
   return networkInfo != null && networkInfo.isConnected();
}

PS: Это не проверяет какой-либо хост, он просто проверяет connectionstatus, поэтому, если ваш маршрутизатор не подключен к Интернету, и ваше устройство подключено к нему, этот метод вернет true, хотя у вас нет интернета.
Для фактического теста я бы рекомендовал выполнить запрос HttpHead (например, на www.google.com) и проверить статус, если его 200 OK все в порядке, и ваше устройство имеет подключение к Интернету.




Вот метод, который я использую:

public boolean isNetworkAvailable(final Context context) {
    return ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo() != null;
}

Еще лучше, убедитесь, что он «подключен»:

public boolean isNetworkAvailable(final Context context) {
    final ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
    return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected();
}

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

if (isNetworkAvailable(context)) {
    // code here
} else {
    // code
}

Необходимое разрешение:

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

https://.com/a/16124915/950427




Вы можете выполнять итерацию по всем сетевым соединениям и проверять, есть ли хотя бы одно доступное соединение:

public boolean isConnected() {
    boolean connected = false;

    ConnectivityManager cm = 
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    if (cm != null) {
        NetworkInfo[] netInfo = cm.getAllNetworkInfo();

        for (NetworkInfo ni : netInfo) {
            if ((ni.getTypeName().equalsIgnoreCase("WIFI")
                    || ni.getTypeName().equalsIgnoreCase("MOBILE"))
                    && ni.isConnected() && ni.isAvailable()) {
                connected = true;
            }

        }
    }

    return connected;
}



Это работает для меня. Попробуйте.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    try {
        URL url = new URL("http://.com/posts/11642475/edit" );
        //URL url = new URL("http://www.nofoundwebsite.com/" );
        executeReq(url);
        Toast.makeText(getApplicationContext(), "Webpage is available!", Toast.LENGTH_SHORT).show();
    }
    catch(Exception e) {
        Toast.makeText(getApplicationContext(), "oops! webpage is not available!", Toast.LENGTH_SHORT).show();
    }
}

private void executeReq(URL urlObject) throws IOException
{
    HttpURLConnection conn = null;
    conn = (HttpURLConnection) urlObject.openConnection();
    conn.setReadTimeout(30000);//milliseconds
    conn.setConnectTimeout(3500);//milliseconds
    conn.setRequestMethod("GET");
    conn.setDoInput(true);

    // Start connect
    conn.connect();
    InputStream response =conn.getInputStream();
    Log.d("Response:", response.toString());
}}



Не сложно проверить статус сети Android / интернет-соединения. DetectConnection класс DetectConnection поможет вам проверить этот статус:

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

public class DetectConnection {
    public static boolean checkInternetConnection(Context context) {
        ConnectivityManager con_manager = (ConnectivityManager) context
                                .getSystemService(Context.CONNECTIVITY_SERVICE);

        if (con_manager.getActiveNetworkInfo() != null
            && con_manager.getActiveNetworkInfo().isAvailable()
            && con_manager.getActiveNetworkInfo().isConnected()) {
                return true;
        } else {
            return false;
        }
    }
}

Дополнительные сведения см. В разделе « Как проверить статус сети Android / Интернет»




Ниже приведен код из моего класса Utils :

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



Этот метод можно использовать для определения доступности сети -

public static boolean isDeviceOnline(Context context) {
        boolean isConnectionAvail = false;
        try {
            ConnectivityManager cm = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            return netInfo.isConnected();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return isConnectionAvail;
    }



Другие ответы, которые используют ConnectivityManager, неверны, потому что наличие сетевого подключения не означает, что у вас есть доступ в Интернет. Например, пользователь может подключиться к WiFi-порту кофейни, но не может попасть в Интернет. Чтобы проверить доступность Интернета, вам нужно попытаться подключиться к реальному серверу. Обычно, когда вы хотите сделать это, у вас есть определенный сервер, в который вы хотите подключиться, поэтому продолжайте и проверьте, можете ли вы подключиться к этому серверу. Вот простой способ проверки подключения к серверу.

private boolean isOnTheInternet() {
    try {
        URLConnection urlConnection = new URL("http://yourserver").openConnection();
        urlConnection.setConnectTimeout(400);
        urlConnection.connect();
        return true;
    } catch (Exception e) {
        return false;
    }
}

Причина установки ConnectTimeout заключается в том, что в противном случае по умолчанию используется таймаут TCP, который может длиться много секунд.

Отметим также, что Android не позволит вам запускать это в своем основном потоке.







Просто создайте следующий класс, который проверяет подключение к Интернету:

public class ConnectionStatus {

    private Context _context;

    public ConnectionStatus(Context context) {
        this._context = context;
    }

    public boolean isConnectionAvailable() {
        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;
    }
}

Этот класс просто содержит метод, который возвращает логическое значение состояния соединения. Поэтому в простых терминах, если метод находит правильное соединение с Интернетом, возвращаемое значение true, иначе, falseесли не найдено действительного соединения.

Следующий метод в MainActivity затем вызывает результат из ранее описанного метода и предлагает пользователю действовать соответственно:

public void addListenerOnWifiButton() {
        Button btnWifi = (Button)findViewById(R.id.btnWifi);

        iia = new ConnectionStatus(getApplicationContext());

        isConnected = iia.isConnectionAvailable();
        if (!isConnected) {
            btnWifi.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
                    Toast.makeText(getBaseContext(), "Please connect to a hotspot",
                            Toast.LENGTH_SHORT).show();
                }
            });
        }
        else {
            btnWifi.setVisibility(4);
            warning.setText("This app may use your mobile data to update events and get their details.");
        }
    }

В приведенном выше коде, если результат является ложным (поэтому нет подключения к Интернету, пользователь переходит на панель Wi-Fi Android, где ему предлагается подключиться к Wi-Fi-точке доступа.




Очень важно проверить, есть ли у нас связь с isAvailable() и если возможно установить соединение с isConnected()

private static ConnectivityManager manager;

public static boolean isOnline(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected();
}

и вы можете нарушить тип сетевого активного WiFi :

public static boolean isConnectedWifi(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}

или мобильная Móvil :

public static boolean isConnectedMobile(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
}

не забывайте разрешения:

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



Related