Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check if mobile network is enabled/disabled

Tags:

android

I would like to know if the mobile network is enabled or disabled.

My application is designed to help the user when he receives a phone call, and to do this I need Internet access. Thus, I would like to display an information box when the user access the application for the first time if Wi-Fi has a sleep policy and Mobile network is disabled. (I need Internet within milliseconds after the phone start ringing).

I found Settings.System.WIFI_SLEEP_POLICY, but I can't find any information on how to check if mobile network is disabled (when Wi-Fi is on and working).

Any help would be appreciated!

Edit: The problem is that I want to know if mobile network is turned of by the user (while the phone could have WiFi access at the time).

like image 938
Cremons Avatar asked Nov 22 '11 08:11

Cremons


4 Answers

I finally found a solution. Apparently not all phones have this option:

Home > Menu > Settings > Wireless & networks > Mobile network (checkbox)

However, for those who do, this method will work:

/**
 * @return null if unconfirmed
 */
public Boolean isMobileDataEnabled(){
    Object connectivityService = getSystemService(CONNECTIVITY_SERVICE); 
    ConnectivityManager cm = (ConnectivityManager) connectivityService;

    try {
        Class<?> c = Class.forName(cm.getClass().getName());
        Method m = c.getDeclaredMethod("getMobileDataEnabled");
        m.setAccessible(true);
        return (Boolean)m.invoke(cm);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
like image 137
Cremons Avatar answered Oct 23 '22 17:10

Cremons


apparently there is an alternative, more clean solution then the Reflection approach:

final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
final NetworkInfo networkInfo = cm.getActiveNetworkInfo();
int type = networkInfo.getType();
String typeName = networkInfo.getTypeName();
boolean connected = networkInfo.isConnected()

networkInfo.getType() will return '0' when connected to mobile network or '1' when connected trough WIFI. networkInfo.getTypeName() will return the strings "mobile" or "WIFI". and networkInfo.isConnected() will tell you whether or not you have an active connection.

like image 20
bvanvelsen Avatar answered Oct 23 '22 19:10

bvanvelsen


UPDATE FOR ANDROID 5.0+ (API 21+)

Calling getMobileDataEnabled via the reflection leads to NoSuchMethodException on Android 5.0+ on some devices. So in addition to accepted answer you may wanna do second check if NoSuchMethodException is thrown.

...
catch(NoSuchMethodException e)
{
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
  {
      isDataEnabled = Settings.Global.getInt(context.getContentResolver(), "mobile_data", 0) == 1;
  }
}
like image 34
stevo.mit Avatar answered Oct 23 '22 17:10

stevo.mit


you can use below code this is working for all API versions:

ConnectivityManager cm =
            (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean isConnected = activeNetwork != null &&
                          activeNetwork.isConnectedOrConnecting();

if(isConnected)
{
if(activeNetwork.getType()==ConnectivityManager.TYPE_MOBILE)
return true;    

else
    return false;
}

else
    return false;
like image 39
Arun kumar Avatar answered Oct 23 '22 17:10

Arun kumar