Не принимать событие изменения состояния мобильного состояния при включенном Wi-Fi

Мне нужно получить уведомление о включении/отключении мобильных данных. Для этого я использую BroadcastReceiver и зарегистрирую событие ConnectivityManager.CONNECTIVITY_ACTION. Однако это событие срабатывает только тогда, когда Wi-Fi отключен. Как только я включу Wi-Fi, я перестаю получать какие-либо события при включении/отключении мобильных данных.

Любые идеи? Мне нужно принять событие изменения состояния мобильной информации независимо от состояния wi-fi.

Ответ 1

  • Слушайте ConnectivityManager.CONNECTIVITY_ACTION

  • В вашем Broadcast Receiver, проверьте полученное намерение и получите информацию о сети

    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
        final NetworkInfo networkInfo = 
            intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
    
  • Проверьте

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

    Мобильные данные недоступны

  • Другое разумное в случае

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

    Доступны мобильные данные

Чтобы обновить пользовательский интерфейс, вы можете прочитать текущее состояние мобильных данных с помощью диспетчера подключений, например:

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;

    }

Ответ 2

Проблема заключается в том, что когда пользователь подключается к WiFi, устройство перестает использовать мобильные данные. Чтобы включить и отключить его, это не будет иметь никакого эффекта.

ConnectivityManager.CONNECTIVITY_ACTION просто уведомляет об установленных или потерянных соединениях. Таким образом, пока вы находитесь в сети WiFi, для обнаружения этих изменений не требуется подключение к мобильной сети, независимо от того, включена ли она или отключена.

Из-за этого я не уверен, что будет возможно обнаружить изменения состояния мобильных данных при подключении к WiFi

Ответ 3

Ну, не уверен, что вы можете полагаться на уведомление от ConnectivityManager.CONNECTIVITY_ACTION в этом конкретном случае.

Но, если вы хотите прочитать, если параметр "мобильные данные" включен/отключен в любой момент.

Вы можете использовать следующее:

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

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

boolean isMobileDataEnabled = (Boolean)method.invoke(conn);

Ответ 4

Я протестировал два приемника действия.

1.

ConnectivityManager.CONNECTIVITY_ACTION;

Он не может принимать мобильные данные с включенными или отключенными, если wifi подключен.

2.

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

(Он скрыт)

Он может принимать мобильные данные, если Wi-Fi подключен. и не может принимать мобильные данные.

Мое тестовое устройство - Samsung Galaxy S4 mini LTE Корейская модель (SHV-E370K), а не глобальная модель (GT-I9195)

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

Если Wi-Fi подключен, система не вызывает 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);
}