3

我需要在启用/禁用移动数据时收到通知。为此,我正在使用 BroadcastReceiver 并注册到 ConnectivityManager.CONNECTIVITY_ACTION 事件。但是,只有在禁用 Wi-Fi 时才会触发该事件。启用 Wi-Fi 后,我在启用/禁用移动数据时停止收到任何事件。

有任何想法吗?无论 wi-fi 状态如何,我都需要接收移动数据状态更改事件。

4

4 回答 4

0

好吧,不确定在这种特殊情况下您是否可以依赖来自 ConnectivityManager.CONNECTIVITY_ACTION 的通知。

但是,如果您想了解移动数据设置是否在任何时候启用/禁用。

您可以使用以下内容:

ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

Method method = conn.getClass().getDeclaredMethod("getMobileDataEnabled");

boolean isMobileDataEnabled = (Boolean)method.invoke(conn);
于 2013-06-13T09:16:47.367 回答
0

问题是当用户连接到 WiFi 时,设备将停止使用移动数据。所以启用和禁用它不会有任何效果。

ConnectivityManager.CONNECTIVITY_ACTION 仅通知已建立或丢失的连接。因此,当您使用 WiFi 时,无论启用还是禁用,都没有移动网络连接来检测这些更改。

因此,我不确定是否可以在连接到 WiFi 时检测到移动数据状态的变化

于 2013-06-13T09:05:48.727 回答
0
  1. 聆听ConnectivityManager.CONNECTIVITY_ACTION

  2. 在您的Broadcast Receiver中,检查收到的意图并获取网络信息

    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
        final NetworkInfo networkInfo = 
            intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
    
  3. 检查

    if ((networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) && !networkInfo.isConnected()
    

    移动数据不可用

  4. 以防万一

    if (networkInfo.isConnected() && (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
    

    移动数据可用

要更新您的 UI,您可以使用 Connectivity Manager 读取移动数据的当前状态,例如:

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

public boolean isNetworkAvailable() {
        boolean status = false;
        try {

            final NetworkInfo netInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            if ((netInfo != null) && (netInfo.getState() == NetworkInfo.State.CONNECTED)) {
                status = true;
            }
        } catch (final Exception e) {
            TLog.e(LOG, "Error Getting Mobile Network State");
            return false;
        }
        return status;

    }
于 2013-06-13T08:50:44.760 回答
0

我测试了两个动作接收器。

1.

ConnectivityManager.CONNECTIVITY_ACTION;

如果 wifi 连接,它无法接收启用或禁用的移动数据。

2.

TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED = "android.intent.action.ANY_DATA_STATE" 

(它是隐藏的)

如果连接了wifi,它可以接收禁用的移动数据。,并且无法接收启用的移动数据。

我的测试设备是三星 Galaxy S4 mini LTE 韩国型号(SHV-E370K)而不是全球型号(GT-I9195)

===========================================

如果wifi连接,系统不会调用dataEnabled(因为不需要移动数据)。

所以无法接收移动启用状态(实际上,移动数据未启用)

我决定安排计时器(周期 = 10000 毫秒)并检查getMobileDataEnabled().

private Method connectivityManager_getMobileDataEnabled = null;
private Method getConnectivityManager_getMobileDataEnabled() throws NoSuchMethodException {

    if (connectivityManager_getMobileDataEnabled == null) {
        connectivityManager_getMobileDataEnabled = ConnectivityManager.class.getMethod(
                "getMobileDataEnabled",
                new Class[0]);
    }

    return connectivityManager_getMobileDataEnabled;
}

public boolean getMobileDataEnabled() 
        throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

    Method getMobileDataEnabled = getConnectivityManager_getMobileDataEnabled();
    getMobileDataEnabled.setAccessible(true);
    return (Boolean) getMobileDataEnabled.invoke(mConnectivityManager);
}
于 2014-02-26T08:18:21.973 回答