android - 如何判断 'Mobile Network Data' 是启用还是禁用(即使通过 WiFi 连接)?

标签 android networking network-connection

我有一个应用程序,我希望能够使用它从远程查询中获取连接状态报告。

我想知道是否连接了 WiFi,以及是否通过移动网络启用了数据访问。

如果 WiFi 超出范围,我想知道我是否可以依赖移动网络。

问题是wifi连接时data enabled总是返回true,没有wifi连接时才能正常查询移动网络。

我看到的所有答案都建议轮询以查看当前连接是什么,但我想知道移动网络是否可用,如果我需要它,即使我目前可能通过 WiFi 连接。

有没有不轮询看是否连接就知道是否开启移动网络数据?

编辑

因此,当通过 WiFi 连接时,如果我转到设置并取消选择“启用数据”,然后在我的应用程序中执行以下操作:

 boolean mob_avail = 
 conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isAvailable();

mob_avail 返回为“true”,但我已禁用移动网络数据,所以我希望它为“false”

如果我关闭 WiFi,则(正确地)没有连接,因为我已禁用移动网络数据。

那么当我通过WiFi连接时如何检查是否启用了移动网络数据?

更新

我查看了 ss1271 评论中建议的 getAllNetworkInfo()

我在以下 3 个条件下输出了返回的关于移动网络的信息

WiFi 关闭 - 移动数据开启

WiFi 开启 - 移动数据关闭

WiFi 开启 - 移动数据开启

得到以下结果:

With WiFi OFF:

mobile[HSUPA], state: CONNECTED/CONNECTED, reason: unknown, extra: internet, roaming: false, failover: false, isAvailable: true, featureId: -1, userDefault: false

With WiFi On / Mobile OFF

NetworkInfo: type: mobile[HSUPA], state: DISCONNECTED/DISCONNECTED, reason: connectionDisabled, extra: (none), roaming: false, failover: false, isAvailable: true, featureId: -1, userDefault: false

With WiFi On / Mobile On

NetworkInfo: type: mobile[HSPA], state: DISCONNECTED/DISCONNECTED, reason: connectionDisabled, extra: (none), roaming: false, failover: false, isAvailable: true, featureId: -1, userDefault: false

所以您可以看到 isAvailable 每次都返回 true,并且状态仅在 WiFi 生效时显示为 Disconnected。

澄清

查看我的手机当前是否已通过移动网络连接。我AM试图确定用户是否已启用/禁用通过移动网络访问数据。他们可以通过转到设置 -> 无线和网络设置 -> 移动网络设置 -> 启用数据来打开和关闭此功能

最佳答案

以下代码将告诉您“移动数据”是否启用,无论当前是否有移动数据连接或 wifi 是否启用/激活。 这个代码仅适用于 Android 2.3 (Gingerbread) 及更高版本。 实际上这段代码也适用于早期版本的 Android ;-)

    boolean mobileDataEnabled = false; // Assume disabled
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    try {
        Class cmClass = Class.forName(cm.getClass().getName());
        Method method = cmClass.getDeclaredMethod("getMobileDataEnabled");
        method.setAccessible(true); // Make the method callable
        // get the setting for "mobile data"
        mobileDataEnabled = (Boolean)method.invoke(cm);
    } catch (Exception e) {
        // Some problem accessible private API
        // TODO do whatever error handling you want here
    }

注意:您需要获得 android.permission.ACCESS_NETWORK_STATE 权限才能使用此代码。

关于android - 如何判断 'Mobile Network Data' 是启用还是禁用(即使通过 WiFi 连接)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12806709/

相关文章:

linux - IP header 可以在不同机器上有不同的偏移量吗?

networking - 是否可以重复或重新分配蓝牙信号?

java - 如何在我的服务中有效地安排任务?

android - 如何禁用以编程方式长按主页按钮启动谷歌?

android - Activity 转换期间动画缓慢

java - Android 编译器无法找到元数据,即使它存在于 list 文件中

networking - 网络连接关闭

c# - MediaPlayer 类中的 SetDataSource 从 Assets 或 raw 文件夹加载 mp3 文件

algorithm - 在分布式客户端中有效地使用限速 API(Echo Nest)

ios - NSURLDomainError 1005 "The Network Connection Was Lost"