ConnectivityManager.EXTRA_NO_CONNECTIVITY всегда ложна на Android Lollipop

Я использую этот фрагмент кода для обнаружения изменений состояния подключения к Интернету. Он отлично работает на Android <5.0, но на API 21 это:

intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY) 

Всегда ложь. Как заставить этот код работать на Android 5.0?

Мой BroadcastReceiver:

 public class NetworkStateReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, final Intent intent) { if(intent.getExtras()!=null) { final ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); final NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if(networkInfo != null && networkInfo.isConnectedOrConnecting()) { Log.d("receiver test", "detected on"); } } Log.d("receiver test", Boolean.toString(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY))); if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) { Log.d("receiver test", "detected off"); } } } 

Вы можете использовать NetworkRequest, добавленный в API уровня 21.

Создайте настраиваемое действие:

 public static final String CONNECTIVITY_ACTION_LOLLIPOP = "com.example.CONNECTIVITY_ACTION_LOLLIPOP"; 

Создайте новый метод registerConnectivityActionLollipop :

 @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void registerConnectivityActionLollipop() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return; 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) { Intent intent = new Intent(CONNECTIVITY_ACTION_LOLLIPOP); intent.putExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); sendBroadcast(intent); } @Override public void onLost(Network network) { Intent intent = new Intent(CONNECTIVITY_ACTION_LOLLIPOP); intent.putExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, true); sendBroadcast(intent); } }); } 

Добавьте новое действие намерения к фильтру намерения и вызовите registerConnectivityActionLollipop :

 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); intentFilter.addAction(CONNECTIVITY_ACTION_LOLLIPOP); registerReceiver(mBroadcastReceiver, intentFilter); registerConnectivityActionLollipop(); 

Измените BroadcastReceiver для поддержки нового действия:

 private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP && TextUtils.equals(intent.getAction(), ConnectivityManager.CONNECTIVITY_ACTION) || Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && TextUtils.equals(intent.getAction(), CONNECTIVITY_ACTION_LOLLIPOP)) { if (intent.getExtras() != null) { final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); final NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnectedOrConnecting()) { Log.d("receiver test", "detected on"); } } Log.d("receiver test", Boolean.toString(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY))); if (intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) { Log.d("receiver test", "detected off"); } } } }; 
Intereting Posts
Как отправить информацию о местоположении Google Maps через SMS в качестве ссылки Автономный вектор TileProvider, который расширяет карту google api v2 в android ЗДЕСЬ Карты Android Интеграция, ошибка MISSING_LIBRARIES Получение данных отпечатков? Шрифт Typeface не работает Сегментация изображения по цвету фона – OpenCV Android В чем разница между индексированием приложений и глубоким связыванием? Приложение ведет себя двумя разными способами, когда пользователь выбирал открытые и выполняемые во время установки в android.so что такое resion? FragmentTransaction hide / show иногда не работает Не работает ли высота в виджетах Android Home Screen? Какой первичный ключ установить на локальную базу данных Android до синхронизации с сервером? Приложение-приемник Chromecast не может воспроизводить широко распространенный контент с защитой DRM от приложения отправителя Android Приложение Android ClassNotFoundException, Невозможно создать экземпляр приложения Как создать пользовательскую тему и использовать ее в приложении для Android Может ли Flow и Mortar загружать экран в фоновом режиме, если он медленно загружается (например, GoogleMap)?