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"); } } } };