61

I want to check when the network of phone in Android goes off. Can I capture that event?

I am not getting the proper API or any example which would explain the same. If anyone had done or any example links would be really helpful.

4 Answers 4

147

New java class:

public class ConnectionChangeReceiver extends BroadcastReceiver
{
  @Override
  public void onReceive( Context context, Intent intent )
  {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
    NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(     ConnectivityManager.TYPE_MOBILE );
    if ( activeNetInfo != null )
    {
      Toast.makeText( context, "Active Network Type : " + activeNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show();
    }
    if( mobNetInfo != null )
    {
      Toast.makeText( context, "Mobile Network Type : " + mobNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show();
    }
  }
}

New xml in your AndroidManifest.xml under the "manifest" element:

<!-- Needed to check when the network connection changes -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

New xml in your AndroidManifest.xml under the "application" element:

<receiver android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver"
          android:label="NetworkConnection">
  <intent-filter>
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
  </intent-filter>
</receiver>
4
  • as @noillusioin says, the activeNetInfo can be null. This is an indication that the network connection JUST DISCONNECTED if you know (save state) that you were connected previously.
    – larham1
    Commented Apr 18, 2013 at 21:10
  • @Eric is there any alternate for getNetworkInfo?? Because its deprecated.
    – MashukKhan
    Commented Sep 26, 2016 at 6:06
  • @MashukKhan it's....literally right there in the javadoc: "This method was deprecated in API level 23. This method does not support multiple connected networks of the same type. Use getAllNetworks() and getNetworkInfo(android.net.Network) instead."
    – Eric
    Commented Sep 26, 2016 at 18:37
  • 2
    Beginning with Android 7.0, you can't set CONNECTIVITY_CHANGE in your Manifest. You need to do that dynamically.
    – CopsOnRoad
    Commented Mar 13, 2018 at 18:20
18

I have been using a small setup to check the bandwidth for determining how to scale things, such as images.

Under the activity, in AndroidManifest:

<intent-filter>
...
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>

In the activity where the checks are being performed:

boolean network;
int bandwidth;

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    network = isDataConnected();
    bandwidth = isHighBandwidth();
    registerReceiver(new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            network = isDataConnected();
            bandwidth = isHighBandwidth();
        }
    }, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
    ...
}
...
private boolean isDataConnected() {
    try {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo().isConnectedOrConnecting();
    } catch (Exception e) {
        return false;
    }
}

private int isHighBandwidth() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = cm.getActiveNetworkInfo();
    if (info.getType() == ConnectivityManager.TYPE_WIFI) {
        WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        return wm.getConnectionInfo().getLinkSpeed();
    } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
        TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getNetworkType();
    }
    return 0;
}

An example usage would then be:

if (network) {
    if (bandwidth > 16) {
        // Code for large items
    } else if (bandwidth <= 16 && bandwidth > 8) {
        // Code for medium items
    } else {
        //Code for small items
    }
} else {
    //Code for disconnected
}

It's not the prettiest, but it allows enough flexibility that I can change the bandwidth cutoff for items depending on what they are and my requirements for them.

0
11

If using Android Annotations is an option for you try this in your activities - that's all, the rest is generated:

@Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION,
        registerAt = Receiver.RegisterAt.OnResumeOnPause)
void onConnectivityChange() {
    //react
}

Use this only if you already use AndroidAnnotations - putting this dependency inside your project only for this piece of code would be overkill.

3
  • Can you please put more explanations about this answer. I have tried to find something but I couldn't. There is not @Receiver annotation in google annotation library. Thanks! Commented Feb 10, 2016 at 7:39
  • Hey, I refer to the 3rd party library AndroidAnnotations. I update my answer. Commented Feb 11, 2016 at 18:49
  • Yes you right, with this library it is possible and also I found this github.com/jd-alexander/flender check it not bad, but you can use it only with gradle build 1.3, with the new build gradle plugins does not work Commented Feb 11, 2016 at 21:36
9

The above answer only works if mobile packet data is enabled. Otherwise, ConnectivityManager would be null and you can no longer retrieve NetworkInfo. The way around it is to use a PhoneStateListener or TelephonyManager instead.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.