Android棒棒糖上的ConnectivityManager.EXTRA_NO_CONNECTIVITY始终为false

我正在使用这段代码来检测Internet连接状态更改。 它在Android <5.0上工作正常,但在API 21上:

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

总是假的。 如何使这个代码在Android 5.0上工作?

我的广播接收机:

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

Solutions Collecting From Web of "Android棒棒糖上的ConnectivityManager.EXTRA_NO_CONNECTIVITY始终为false"

您可以使用API​​级别21中添加的NetworkRequest 。

创build一个自定义意图操作:

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

创build新的方法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); } }); } 

将新的意图操作添加到意图filter并调用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"); } } } };