ConnectivityManager.CONNECTIVITY_ACTION отключить сеть от API ›= 14?

Мне нужно получить сеть, от которой устройство было отключено.

Теперь я использую:

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

И проверьте:

ni.isConnected()

если это возвращает false ni - это сеть, от которой устройство было отключено.

Но ConnectivityManager.EXTRA_NETWORK_INFO устарело в API 14. Google рекомендует использовать getActiveNetworkInfo() для получения информации о сети. Но getActiveNetworkInfo() всегда возвращает сеть, к которой сейчас подключено устройство (isConnected() должно возвращать true)!

Как получить сетевую информацию для сети, от которой отключено устройство, без использования ConnectivityManager.EXTRA_NETWORK_INFO?

Серторио Норонья, когда я использую getActiveNetworkInfo(), я получаю только ту сеть, к которой сейчас подключен! Но мне нужно получить сеть, от которой я отключился.

ConnectivityManager cm = (ConnectivityManager)
    context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo n1 = cm.getActiveNetworkInfo();
Log.d("tets", String.format("%s: %s", n1.getTypeName(), n1.isConnected()));

При отключении от WI-FI и подключении к 3G в логе:

mobile: true
mobile: true

При отключении от 3G и подключении к WI-FI в логе:

WIFI: true
WIFI: true
WIFI: true

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

Если я использую устаревшее намерение.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO) в журнале, я вижу:

Когда я отключаюсь от WI-FI и подключаюсь к 3G:

WIFI: false
mobile: true

Когда я отключаюсь от 3G и подключаюсь к WI-FI:

mobile: false
WIFI: true

Но я не хочу использовать устаревший API. Как использовать современный API, чтобы получить сеть, от которой я был отключен?


person Nik    schedule 08.11.2012    source источник


Ответы (3)


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

ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
int networkType = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_TYPE);
boolean isWiFi = networkType == ConnectivityManager.TYPE_WIFI;
boolean isMobile = networkType == ConnectivityManager.TYPE_MOBILE;
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(networkType);
boolean isConnected = networkInfo.isConnected();

if (isWiFi) {
    if (isConnected) {
        Log.i("APP_TAG", "Wi-Fi - CONNECTED");
    } else {
        Log.i("APP_TAG", "Wi-Fi - DISCONNECTED");
    }
} else if (isMobile) {
    if (isConnected) {
        Log.i("APP_TAG", "Mobile - CONNECTED");
    } else {
        Log.i("APP_TAG", "Mobile - DISCONNECTED");
    }
} else {
    if (isConnected) {
        Log.i("APP_TAG", networkInfo.getTypeName() + " - CONNECTED");
    } else {
        Log.i("APP_TAG", networkInfo.getTypeName() + " - DISCONNECTED");
    }
}
person AGK    schedule 15.12.2013
comment
используйте extras.getInt для EXTRA_NETWORK_TYPE, также это поле было введено в API 17. - person Muhammad Babar; 25.11.2014

Вы можете получить экземпляр NetworkInfo через Context.

ConnectivityManager connectivityManager = ((ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE));
NetworkInfo currentNetworkInfo = connectivityManager.getActiveNetworkInfo();

if(currentNetworkInfo != null && currentNetworkInfo.isConnected()){
   // Your logic goes in here
}
person Sertorio Noronha    schedule 22.02.2013
comment
Пожалуйста, используйте getTypeName() из класса NetworkInfo. developer.android.com/reference/android/net/NetworkInfo.html - person Sertorio Noronha; 25.02.2013
comment
Ваш ответ не отвечает на мой вопрос! Посмотрите шапку темы, я предоставляю дополнительную информацию. - person Nik; 27.02.2013
comment
Очень простым решением будет сохранение предыдущего значения в локальной строке. Ваша проблема может быть решена с помощью простой логики. - person Sertorio Noronha; 27.02.2013
comment
это было решением для меня, так как мне тоже нужен был уровень API 14-16 - person keybee; 04.01.2015

Рабочий неустаревший код

/**Receiver*/   

 public class NetworkStateReceiver extends BroadcastReceiver {

        /*
         * @see android.content.BroadcastReceiver#onReceive(android.content.Context,
         * android.content.Intent)
         */
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
            int networkType = intent.getExtras().getInt(ConnectivityManager.EXTRA_NETWORK_TYPE);
            boolean isWiFi = networkType == ConnectivityManager.TYPE_WIFI;
            boolean isMobile = networkType == ConnectivityManager.TYPE_MOBILE;
            NetworkInfo networkInfo = connectivityManager.getNetworkInfo(networkType);
            boolean isConnected = networkInfo.isConnected();

            if (isWiFi) {
                if (isConnected) {
                    Log.i("APP_TAG", "Wi-Fi - CONNECTED");
                } else {
                    Log.i("APP_TAG", "Wi-Fi - DISCONNECTED");
                }
            } else if (isMobile) {
                if (isConnected) {
                    Log.i("APP_TAG", "Mobile - CONNECTED");
                } else {
                    Log.i("APP_TAG", "Mobile - DISCONNECTED");
                }
            } else {
                if (isConnected) {
                    Log.i("APP_TAG", networkInfo.getTypeName() + " - CONNECTED");
                } else {
                    Log.i("APP_TAG", networkInfo.getTypeName() + " - DISCONNECTED");
                }
            }
        }

    }

И в манифесте

<!-- Receiver registration in manifest -->
     <receiver android:name="com.xxx.yyy.NetworkStateReceiver" >
                <intent-filter>
                    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                </intent-filter>
            </receiver>

и

<!-- Internet permission for network comunication -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
person Vinayak    schedule 08.08.2014
comment
android.net.conn.CONNECTIVITY_CHANGE устарело в Android N – FYI - person behelit; 28.07.2016
comment
Спасибо за комментарий, это было написано много дней назад, скоро будет обновлено в соответствии с новым Android N. - person Vinayak; 28.07.2016
comment
@behelit Я думал, что CONNECTIVITY_ACTION устарела в Android N? developer.android.com/preview/behavior-changes.html - person RmK; 05.08.2016
comment
Это не устарело, оно будет запускать только приложения, которые находятся на переднем плане и прослушивают. Если ваше приложение зарегистрировано для этого события и остановлено или находится в фоновом режиме, оно не получит уведомления. - person Chapz; 24.08.2016