【问题标题】:How to check if mobile network is enabled/disabled如何检查移动网络是否启用/禁用
【发布时间】:2016-01-26 16:31:41
【问题描述】:

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

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

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

任何帮助将不胜感激!

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

【问题讨论】:

  • stackoverflow.com/questions/8211081/… 的完全相同的副本
  • 不一样。 ((LocationManager)getSystemService(Context.LOCATION_SERVICE)).isProviderEnabled(LocationManager.NETWORK_PROVIDER);当移动网络被禁用并且 Wi-Fi 被启用(并且工作)时为真。来自 API:位置基于手机信号塔和 WiFi 接入点的可用性

标签: android


【解决方案1】:

我终于找到了解决办法。显然不是所有手机都有这个选项:

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

但是,对于那些这样做的人,这种方法会起作用:

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

【讨论】:

  • 别忘了在你的 AndroidManifest.xml 中添加
  • @DanielNugent 有什么想法为什么?
  • @PeterChaula 这是一个安全漏洞,最初甚至可能是无意的。谷歌修复了安全漏洞,因此不再可能这样做。请参阅此处了解更多信息:stackoverflow.com/questions/26539445/…
  • @DanielNugent 必须始终尽可能避免“hacky”反射的原因之一。
【解决方案2】:

显然有一个替代的,比反射方法更干净的解决方案:

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() 会告诉你你是否有一个活跃的连接。

【讨论】:

  • @sandeep_jagtap 是的,自 API 级别 1 起,这一切都在 Android 中
  • 如果手机处于飞行模式,getActiveNetworkInfo() 将返回 null,即使启用了“移动数据”设置。
【解决方案3】:

ANDROID 5.0+ (API 21+) 更新

在某些设备的 Android 5.0+ 上,通过反射调用 getMobileDataEnabled 会导致 NoSuchMethodException。因此,在除了接受的答案之外,您可能需要再次检查是否抛出了NoSuchMethodException

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

【讨论】:

  • 我在 Settings.Global developer.android.com/reference/android/provider/… 下没有看到任何这样的常量“mobile_data”。我想知道它是如何工作的或者你。
  • @LoveForDroid "@Hide" 注释。
  • 此代码是否适用于 os 7+?你能提供 OS 的代码吗
【解决方案4】:

您可以使用以下适用于所有 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;

【讨论】:

  • 这将告诉我我的活动网络。我想知道用户是否关闭了移动网络。如果我连接到 wifi,答案可能仍然是肯定的和否定的。
  • 这只会获取活动网络,如果用户同时启用 wifi 和 3b,则如果通过 wifi 连接,则始终返回 TYPE_WIFI
【解决方案5】:
    PackageManager pm = context.getPackageManager();
    boolean hasTelephony = pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);

【讨论】:

猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多