Как получить изменение состояния сети на Android?

У меня есть широковещательный приемник для "CONNECTIVITY_CHANGE". Когда я печатаю лишнее, используя это:

intent.getExtras().toString() 

Я вижу, что если я отключу WIFI, я получу 2 сетевых изменения.

  1. WIFI ОТКЛЮЧЕН
  2. МОБИЛЬНЫЙ ПОДКЛЮЧЕН

Тем не менее, когда я пытаюсь использовать

NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);

Он сказал, что этот API устарел. После этого я попытался использовать это

int networkType = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_TYPE);
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(networkType);

Однако getNetworkInfo также устарела.

Единственный вариант, который мне дали, - это использовать getActiveNetworkInfo или getActiveNetwork.

Если я использую это, я получу 2 трансляции, которые дадут мне ту же информацию о сети.

Есть ли лучший способ обработки состояния сети в Android?

ДОПОЛНИТЕЛЬНОЕ ПРИМЕЧАНИЕ:

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

Мне нужно знать, какая сеть была отключена и подключена. Изменение состояния сети - это то, что я ищу.

6 ответов

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

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

Разрешения, необходимые для доступа к состоянию сети:

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

Теперь проверьте следующую утилиту класса NetworkUtil. У него есть метод getConnectivityStatus, который возвращает константу int в зависимости от текущего сетевого подключения. Если Wi-Fi включен, этот метод вернет TYPE_WIFI. Аналогично для мобильной сети передачи данных возвращается TYPE_MOBILE. У тебя есть идея!!

Существует также метод getConnectivityStatusString, который возвращает текущее состояние сети в виде более читаемой строки.

Создайте класс NetworkUtil.java и вставьте следующий код:

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

public class NetworkUtil {

    public static int TYPE_WIFI = 1;
    public static int TYPE_MOBILE = 2;
    public static int TYPE_NOT_CONNECTED = 0;


    public static int getConnectivityStatus(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (null != activeNetwork) {
            if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
                return TYPE_WIFI;

            if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
                return TYPE_MOBILE;
        } 
        return TYPE_NOT_CONNECTED;
    }

    public static String getConnectivityStatusString(Context context) {
        int conn = NetworkUtil.getConnectivityStatus(context);
        String status = null;
        if (conn == NetworkUtil.TYPE_WIFI) {
            status = "Wifi enabled";
        } else if (conn == NetworkUtil.TYPE_MOBILE) {
            status = "Mobile data enabled";
        } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
            status = "Not connected to Internet";
        }
        return status;
    }
}

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

Broadcast Receiver для обработки изменений в состоянии сети

Вы можете легко справиться с изменениями в состоянии сети, создав собственный Broadcast Receiver. Ниже приведен класс приемника вещания, где мы обрабатываем изменения в сети.

Проверьте метод onReceive(). Этот метод будет вызываться при изменении состояния сети. Здесь мы просто создаем сообщение Toast и отображаем текущее состояние сети. Вы можете написать свой собственный код здесь для обработки изменений в состоянии соединения.

Создайте класс NetworkChangeReceiver.java и вставьте следующий код:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {

        String status = NetworkUtil.getConnectivityStatusString(context);

        Toast.makeText(context, status, Toast.LENGTH_LONG).show();
    }
}

Как только мы определим наш BroadcastReceiver, нам нужно определить то же самое в файле AndroidMenifest.xml. Добавьте следующее в ваш файл манифеста.

<application  ...>
     ...
        <receiver
            android:name="YOUR PACKAGE NAME"
            android:label="NetworkChangeReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
        </receiver>
      ...
</application>

Мы определили наш класс приемника вещания в файле манифеста. Также мы определили два намерения CONNECTIVITY_CHANGE и WIFI_STATE_CHANGED. Таким образом это зарегистрирует наш получатель для данных намерений. Всякий раз, когда происходит изменение в состоянии сети, Android запустит эти намерения, и будет вызван наш широковещательный приемник.

Вот и все, запустите ваш код. Надеюсь, это служит вашей цели!

Используйте приведенный ниже код и проверьте текущее состояние подключения к сети

 public class NetworkStateReceiver extends BroadcastReceiver {

    Context context;


    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        this.context = context;

        Log.d("app","Network connectivity change==>"+isOnline());

        if(isOnline()==true)
        {
            //Internet Connected!

        }
        else
        {
            // No Internet!

        }



    }

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


}

Определите, есть ли у вас подключение к Интернету

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

NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
                      activeNetwork.isConnectedOrConnecting();

Определите тип вашего интернет-соединения

Подключение устройства может быть обеспечено мобильными данными, WiMAX, Wi-Fi и сетевыми подключениями. Опросив тип активной сети, как показано ниже, вы можете изменить частоту обновления в зависимости от доступной пропускной способности.

boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;

Мониторинг изменений в подключении

Приложения, ориентированные на Android 7.0 (уровень API 24), не получают трансляции CONNECTIVITY_ACTION, даже если они регистрируют эти трансляции в своем манифесте. Работающие приложения могут по-прежнему прослушивать CONNECTIVITY_CHANGE в своем основном потоке, регистрируя BroadcastReceiver с Context.registerReceiver().

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

/**
     * Check Internet connection is available or not
     *
     * @param context current context
     *                Use {@link #checkInternetConnection(Context context)}
     * @return {@link Boolean}
     */
    public static boolean checkInternetConnection(Context context) {
        ConnectivityManager _connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        boolean _isConnected = false;
        NetworkInfo _activeNetwork = _connManager.getActiveNetworkInfo();
        if (_activeNetwork != null) {
            _isConnected = _activeNetwork.isConnectedOrConnecting();
        }

        return _isConnected;
    }

Используйте Broadcast Receiver:

Заявка на участие

<receiver android:name=".your.namepackage.here.ConnectivityReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
    </intent-filter>
</receiver>

класс для получателя:

public class ConnectivityReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();
    switch (action) {
        case ConnectivityManager.CONNECTIVITY_ACTION:

            if(isConnect()) //your logic to check netwrok
    {
                //do action here
            }
        break;
    }
}
}

Попробуй этот код

public static boolean isActiveNetworkMetered(Context context) {
    ConnectivityManager manager = getConnectivityManager(context);
    if (manager == null)
        return false; 

    ConnectivityManagerCompat compat = new ConnectivityManagerCompat();
    return compat.isActiveNetworkMetered(manager);
} 

public static String getActiveNetworkName(Context context) {
    try { 
        NetworkInfo info = getActivieNetworkInfo(context);
        String typeName = info.getTypeName().toLowerCase();
        if (typeName.equals("wifi")) {
            return typeName;
        } else { 
            String extraInfoName = info.getExtraInfo().toLowerCase();
            if (!TextUtils.isEmpty(extraInfoName))
                return extraInfoName;
        } 
        return typeName;
    } catch (Exception e) {
        return null; 
    } 
} 
Другие вопросы по тегам