ConnectivityManager.getActiveNetworkInfo() / NetworkInfo устарела в API 29. Какая альтернатива?

Похоже, вся NetworkInfo устарела в API 29.

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

connectivityManager.activeNetworkInfo?.isConnected == true

Примечание: я знаю, что сейчас есть обратный вызов, но я хотел бы получать эту информацию синхронно. Кроме того, я, конечно, понимаю, что это может быть не точная информация, хотя я хотел бы ее иметь.


person hrach    schedule 11.07.2019    source источник
comment
Проверьте это stackoverflow.com/a/56437236/7666442.   -  person AskNilesh    schedule 11.07.2019
comment
Точная страница, на которую вы ссылаетесь, описывает существующие альтернативы.   -  person Zun    schedule 11.07.2019


Ответы (5)


Решение таково:

val capability = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
return capability?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) ?: false
person hrach    schedule 05.08.2019
comment
Подтверждено здесь: developer.android.com/training/basics/network -ops/ - person Blundell; 29.04.2021

Это работает над API 29:

connectivityManager.isDefaultNetworkActive
person Artur Gniewowski    schedule 11.07.2019
comment
Кажется, что это по-прежнему возвращает true, даже в режиме полета. - person hrach; 11.07.2019
comment
В режиме полета можно иметь активную сеть. Цитирую Техопедию: In general, features like FM receiver, Bluetooth, Wi-Fi and GPS should still be operable even when the device is in airplane mode - person Zun; 11.07.2019

android.net.NetworkInfo

Этот класс устарел на уровне API 29. Вместо этого вам следует использовать ConnectivityManager.NetworkCallback API, чтобы узнать об изменениях подключения.

Справочная ссылка https://developer.android.com/reference/android/net/NetworkInfo.html

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();

connectivityManager.registerNetworkCallback(
                    builder.build(),
                    new ConnectivityManager.NetworkCallback() {

                        @Override
                        public void onAvailable(Network network) {
                            // Network Available
                        }


                        @Override
                        public void onLost(Network network) {
                            // Network Not Available
                        }
                    }
            );
person sm_    schedule 11.07.2019

Решение

public void registerNetworkCallback()
{
    try {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkRequest.Builder builder = new NetworkRequest.Builder();

        connectivityManager.registerNetworkCallback(builder.build(),new ConnectivityManager.NetworkCallback() {
                    @Override
                    public void onAvailable(Network network) {
                        Variables.isNetworkConnected = true; // Global Static Variable
                    }
                    @Override
                    public void onLost(Network network) {
                        Variables.isNetworkConnected = false; // Global Static Variable
                    }
                }

        );
        Variables.isNetworkConnected = false;
    }catch (Exception e){
        Variables.isNetworkConnected = false;
    }
}

Проверьте полный код здесь: Gist

person Pasan Bhanu Guruge    schedule 27.09.2019

person    schedule
comment
Спасибо за ваш вклад в сообщество. Это может быть правильным ответом, но было бы полезно предоставить дополнительное объяснение вашего кода, чтобы разработчики могли понять ваши рассуждения. Это особенно полезно для новых разработчиков, которые могут быть незнакомы с синтаксисом. Кроме того, это может помочь уменьшить потребность в дополнительных вопросах. Не могли бы вы обновить свой комментарий с дополнительной информацией? - person Jeremy Caney; 12.05.2020