ConnectivityManager getNetworkInfo (int) устарел


используя compileSdkVersion 23, однако пытаясь поддержать еще 9.

getNetworkInfo (int) был устаревшим в 23. Вместо этого было предложено использовать getAllNetworks и getNetworkInfo(сеть). Однако оба из них требуют минимум API 21.

есть ли класс, который мы можем использовать в пакете поддержки, который может помочь в этом?

Я знаю, что было предложено решение до, однако проблема моего минимального api требования 9 ставит проблему.

7 64

7 ответов:

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

getActiveNetworkInfo();

        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (activeNetwork != null) { 
            // connected to the internet
            if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                // connected to wifi
            } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                // connected to mobile data
            }
        } else {
            // not connected to the internet
        }

или в случае, если переключатель

        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (activeNetwork != null) { 
            // connected to the internet
            switch (activeNetwork.getType()) {
                case ConnectivityManager.TYPE_WIFI:
                    // connected to wifi
                    break;
                case ConnectivityManager.TYPE_MOBILE:
                    // connected to mobile data
                    break;
                default:
                    break;
            }
        } else {
            // not connected to the internet
        }

обновленный ответ (19:07:2018):

этот способ поможет вам проверить, если подключение к интернету доступно.

public static boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (connectivityManager != null) {
        NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
        return (activeNetwork != null && activeNetwork.isConnectedOrConnecting());
    } else {
        return false;
    }
}

ответ:

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

public static boolean isNetworkAvailable(Context context) {
    int[] networkTypes = {ConnectivityManager.TYPE_MOBILE,
            ConnectivityManager.TYPE_WIFI};
    try {
        ConnectivityManager connectivityManager =
                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        for (int networkType : networkTypes) {
            NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
            if (activeNetworkInfo != null &&
                    activeNetworkInfo.getType() == networkType)
                return true;
        }
    } catch (Exception e) {
        return false;
    }
    return false;
}

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

как сыр, хлеб, предложил, использовать getActiveNetworkInfo()

getActiveNetworkInfo

добавлено в API level 1

NetworkInfo getActiveNetworkInfo ()

возвращает сведения о текущей активной сети передачи данных по умолчанию. При подключении эта сеть является маршрутом по умолчанию для исходящих соединений. Перед началом сетевого трафика всегда следует проверять isConnected (). Это может вернуть null, когда нет сеть по умолчанию. Этот метод требует, чтобы вызывающий объект удерживал разрешение ACCESS_NETWORK_STATE. Возвращается NetworkInfo объект NetworkInfo для текущей сети по умолчанию или null, если в данный момент сеть по умолчанию не активна.

Ссылка: Android Studio

 public final boolean isInternetOn() {

    // get Connectivity Manager object to check connection
    ConnectivityManager connec =
            (ConnectivityManager)getSystemService(getBaseContext().CONNECTIVITY_SERVICE);

    // Check for network connections
    if ( connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.CONNECTED ||
            connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.CONNECTING ) {

        // if connected with internet

        Toast.makeText(this, connec.getActiveNetworkInfo().getTypeName(), Toast.LENGTH_LONG).show();
        return true;

    } else if (
            connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.DISCONNECTED ||
                    connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.DISCONNECTED  ) {

        Toast.makeText(this, " Not Connected ", Toast.LENGTH_LONG).show();
        return false;
    }
    return false;
}

Теперь вызовите метод, для безопасного использования попробуйте catch

     try {
     if(isInternetOn()){ //connected actions }
    else{
    //not connected actions }

        }catch (Exception e){
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        }

и не забудьте добавить:

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

Не забудьте поставить

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

в файле манифеста с ответами выше.

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

NetworkInfo.isConnected ()

весь метод может быть как ниже:

/**
 * Checking whether network is connected
 * @param context Context to get {@link ConnectivityManager}
 * @return true if Network is connected, else false
 */
public static boolean isConnected(Context context){
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork != null && activeNetwork.isConnected()) {
        int networkType = activeNetwork.getType();
        return networkType == ConnectivityManager.TYPE_WIFI || networkType == ConnectivityManager.TYPE_MOBILE;
    } else {
        return false;
    }
}

Котлин версия:

fun isInternetOn(context: Context): Boolean {
   val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
   val activeNetwork = cm?.activeNetworkInfo
   return activeNetwork != null && activeNetwork.isConnected
}

Так как ответы размещены только позволяют запрашивать активную сеть, вот как получить NetworkInfo для любой сети, не только активной (например Wifi сети) (извините, код Котлина впереди)

(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).run {
    allNetworks.find { getNetworkInfo(it).type == ConnectivityManager.TYPE_WIFI }?.let { network -> getNetworkInfo(network) }
//    getNetworkInfo(ConnectivityManager.TYPE_WIFI).isAvailable // This is the deprecated API pre-21
}

для этого требуется API 21 или выше и разрешение android.permission.ACCESS_NETWORK_STATE