如何检查移动网络是否已启用/禁用

时间:2011-11-22 08:49:30

标签: android

我想知道移动网络是启用还是禁用。

我的应用程序旨在帮助用户接听电话,为此我需要访问Internet。因此,如果Wi-Fi具有睡眠策略且移动网络被禁用,我想在用户首次访问应用程序时显示信息框。 (电话开始响铃后,我需要在几毫秒内上网。)

我找到了Settings.System.WIFI_SLEEP_POLICY,但我找不到有关如何检查移动网络是否被禁用的任何信息(当Wi-Fi开启并正常工作时)。

任何帮助将不胜感激!

编辑: 问题是我想知道用户是否关闭了移动网络(当时手机可能有WiFi接入)。

5 个答案:

答案 0 :(得分:18)

我终于找到了解决方案。显然并非所有手机都有此选项:

  

主页>菜单>设置>无线&网络>移动网络(复选框)

然而,对于那些做的人,这种方法将起作用:

/**
 * @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;
    }
}

答案 1 :(得分:3)

显然有一种替代的,更干净的解决方案,然后反思方法:

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()在连接到移动网络时将返回“0”   或通过WIFI连接时为“1”。 networkInfo.getTypeName()将返回   字符串“mobile”或“WIFI”。和networkInfo.isConnected()将告诉您是否有活动连接。

答案 2 :(得分:3)

更新ANDROID 5.0+(API 21 +)

在某些设备上,通过反射调用getMobileDataEnabled会在Android 5.0+上导致NoSuchMethodException。因此,在添加到接受的答案时,您可能需要进行第二次检查是否抛出NoSuchMethodException

...
catch(NoSuchMethodException e)
{
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
  {
      isDataEnabled = Settings.Global.getInt(context.getContentResolver(), "mobile_data", 0) == 1;
  }
}

答案 3 :(得分:1)

您可以使用以下代码,这适用于所有API版本:

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;

答案 4 :(得分:0)

    PackageManager pm = context.getPackageManager();
    boolean hasTelephony = pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);