BroadcastReceiver for CONNECTIVITY_ACTION always returns null in intent.getExtras()
Asked Answered
J

2

10


Im trying to receive BroadcastMessages from CONNECTIVITY_ACTION:

    // register BroadcastReceiver on network state changes
    final IntentFilter mIFNetwork = new IntentFilter();
    mIFNetwork.addAction(android.net.ConnectivityManager.CONNECTIVITY_ACTION); //"android.net.conn.CONNECTIVITY_CHANGE"
    registerReceiver(mIRNetwork, mIFNetwork);

and receiver is:

private BroadcastReceiver mIRNetwork = new BroadcastReceiver() {
    @Override
    public void onReceive(final Context context, final Intent intent) {

        android.util.Log.i(TAG,"mIRNetwork: Network State Received: "+intent.getAction());
        Bundle extras = intent.getExtras();
        if (extras!=null){
                android.util.Log.i(TAG,"mIRNetwork: ACTION_BACKGROUND_DATA_SETTING_CHANGED: "+extras.getString(ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED));
                android.util.Log.i(TAG,"mIRNetwork: CONNECTIVITY_ACTION: "+extras.getString(ConnectivityManager.CONNECTIVITY_ACTION));
                android.util.Log.i(TAG,"mIRNetwork: EXTRA_EXTRA_INFO: "+extras.getString(ConnectivityManager.EXTRA_EXTRA_INFO));
                android.util.Log.i(TAG,"mIRNetwork: EXTRA_NO_CONNECTIVITY: "+extras.getString(ConnectivityManager.EXTRA_NO_CONNECTIVITY));
                android.util.Log.i(TAG,"mIRNetwork: EXTRA_REASON: "+extras.getString(ConnectivityManager.EXTRA_REASON));

            }
        }

in short extras is always null. I thought that if i loose WiFi connection i should get EXTRA_NO_CONNECTIVITY (cuz its the only way to Internet) or at least something from the list. But no luck. If i disconnect my WiFi AP receiver gets his message but with null extras. When i turn my WiFi back on once again receiver fires but no extras... Why is that? How to know that app lost any network connection? I thought its the way.

Junji answered 3/8, 2011 at 9:1 Comment(0)
T
16

You can not get extra but you can get data by this way

private class ConnectivityBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager
                .EXTRA_NO_CONNECTIVITY, false);
        NetworkInfo info1 = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager
                .EXTRA_NETWORK_INFO);
        NetworkInfo info2 = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager
                .EXTRA_OTHER_NETWORK_INFO);
        String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);
        boolean failOver = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);
        Log.d("MY_TAG", "onReceive(): mNetworkInfo=" + info1 + " mOtherNetworkInfo = " +
                (info2 == null ? "[none]" : info2 + " noConn=" + noConnectivity));
    }
}

For more info see this

http://code.google.com/p/androidwisprclient/source/browse/trunk/src/com/joan/pruebas/NetworkConnectivityListener.java?r=2

Triennial answered 3/8, 2011 at 9:18 Comment(3)
if(!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) can't understand this when the only action added to filter is CONNECTIVITY_ACTION?Cardoso
@MuhammadBabar You can ignore condition to check action if you have registered only one action for connectivity.Triennial
In order to check if we have Internet connection, is it safe to just use "!intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) " ?Perloff
P
5

Dharmendras answer is good. However, note that EXTRA_NETWORK_INFO is now deprecated (since Api Level 14) and the Android docs say the following:

Since NetworkInfo can vary based on UID, applications should always obtain network information through getActiveNetworkInfo().

That actually makes things very easy for us. You could reuse the connectivity check you probably did before and do something like this:

private class ConnectivityBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        unregisterReceiver(this)
        checkConnection();
    }
}

private void checkConnection() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo()
            .isConnectedOrConnecting()) {
        // do something
    }
}

Assuming you're inside the activity that registered the broadcast of course.

This also has the added benefit of following the best practices for only listening for the connectivity broadcast as briefly as possible, outlined here :)

Psoas answered 10/11, 2015 at 16:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.