Подтвердить что ты не робот

Как определить, включено ли "Мобильные сетевые данные" (даже при подключении через WiFi)?

У меня есть приложение, которое я хочу использовать для получения отчета о статусе соединения из удаленного запроса.

Я хочу знать, подключен ли WiFi, и если доступ к данным разрешен по мобильной сети.

Если WiFi выходит за пределы диапазона, я хочу знать, могу ли я полагаться на мобильную сеть.

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

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

Есть ли способ сообщить, разрешены ли данные мобильной сети без опроса, чтобы увидеть, подключен ли он?

ИЗМЕНИТЬ

Итак, когда подключен WiFi. Если я перейду к настройкам и отмените выбор "Data Enabled", а затем в моем приложении, я сделаю следующее:

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

mob_avail возвращается как "истина", но у меня отключены данные Mobile Network, поэтому я ожидаю, что это будет "false"

Если отключить Wi-Fi, есть (по праву) отсутствие соединения, поскольку я отключил данные мобильной сети.

так как проверить, разрешены ли данные мобильной сети, когда я подключен WiFi?

UPDATE

Я взглянул на getAllNetworkInfo(), как это было предложено в комментариях ss1271

Я вывел возвращаемую информацию о мобильной сети в следующих трех условиях

Wi-Fi отключен - данные для мобильных устройств

Отключено WiFi - отключено.

Информация о беспроводных соединениях WiFi на

и получили следующие результаты:

С отключенным WiFi:

мобильный [HSUPA], состояние: CONNECTED/CONNECTED, причина: неизвестно, дополнительно: Интернет, роуминг: false, failover: false, isAvailable: true, featureId: -1, userDefault: false

С включенным WiFi/ВКЛ.

NetworkInfo: type: mobile [HSUPA], состояние: ОТКЛЮЧЕНО/ОТКЛЮЧЕНО, причина: connectionDisabled, дополнительно: (none), роуминг: false, failover: false, isAvailable: true, featureId: -1, userDefault: ложь

С включенным WiFi/ВКЛ.

NetworkInfo: type: mobile [HSPA], состояние: ОТКЛЮЧЕНО/ОТКЛЮЧЕНО, причина: connectionDisabled, дополнительно: (none), роуминг: false, failover: false, isAvailable: true, featureId: -1, userDefault: ложь

Таким образом, вы можете видеть, что isAvailable возвращает true каждый раз, и состояние отображается только как отключенное, когда WiFi влияет.

РАЗЪЯСНЕНИЕ

Я НЕ, чтобы посмотреть, подключен ли мой телефон к мобильной сети. я AM, пытающийся установить, включен ли пользователь/отключил доступ к данным через мобильную сеть. Они могут включать и выключать это, перейдя в Настройки → Параметры беспроводной сети и сети → Настройки мобильной сети → Данные включены

4b9b3361

Ответ 1

В следующем коде вы узнаете, включена ли "мобильные данные" или нет, независимо от того, активно или нет в данный момент мобильное соединение для передачи данных или включено или нет Wi-Fi или нет. код работает только на 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.

Ответ 2

Я обновил ответ Allesio. Settings.Secure mobile_data int переместился в Settings.Global с 4.2.2.

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

Обновлен, чтобы проверить, доступна ли SIM-карта. Спасибо, что указали на мурата.

boolean mobileYN = false;

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (tm.getSimState() == TelephonyManager.SIM_STATE_READY) {
    if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1)
    {
        mobileYN = Settings.Global.getInt(context.getContentResolver(), "mobile_data", 1) == 1;
    }
    else{
        mobileYN = Settings.Secure.getInt(context.getContentResolver(), "mobile_data", 1) == 1;
    }
}

Ответ 3

Один из способов - проверить, активирован ли мобильный телефон в настройках, который, скорее всего, будет использоваться, если Wi-Fi отключится. Это работает (проверено), и оно не использует отражение, хотя в API использует скрытое значение:

boolean mobileDataAllowed = Settings.Secure.getInt(getContentResolver(), "mobile_data", 1) == 1;

В зависимости от API вам нужно проверить Settings.Global вместо Settings.Secure, как указано @user1444325.

Источник: Android API для определения пользовательских настроек "Data Enabled"

Ответ 4

Функция @sNash работает отлично. Но в нескольких устройствах я обнаружил, что он возвращает true, даже если данные отключены. Поэтому я нашел одно альтернативное решение, которое находится в Android API.

getDataState() метод TelephonyManager будет очень полезно.

Я обновил функцию @snash с использованием вышеуказанной функции. Функция ниже возвращает false, когда данные сотовой связи отключены, в противном случае это правда.

private boolean checkMobileDataIsEnabled(Context context){
        boolean mobileYN = false;

        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        if (tm.getSimState() == TelephonyManager.SIM_STATE_READY) {
            TelephonyManager tel = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
//          if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1)
//          {
//              mobileYN = Settings.Global.getInt(context.getContentResolver(), "mobile_data", 0) == 1;
//          }
//          else{
//              mobileYN = Settings.Secure.getInt(context.getContentResolver(), "mobile_data", 0) == 1;
//          }
            int dataState = tel.getDataState();
            Log.v(TAG,"tel.getDataState() : "+ dataState);
            if(dataState != TelephonyManager.DATA_DISCONNECTED){
                mobileYN = true;
            }

        }

        return mobileYN;
    }

Ответ 5

Вы можете попробовать что-то вроде этого:

ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

//mobile
State mobile = conMan.getNetworkInfo(0).getState();

//wifi
State wifi = conMan.getNetworkInfo(1).getState();


if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING) 
{
    //mobile
}
else if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING) 
{
    //wifi
}

Если вам интересно, если вы действительно подключены, используйте

NetworkInfo.State.CONNECTED 

а не

NetworkInfo.State.CONNECTED || NetworkInfo.State.CONNECTING

Ответ 6

Вот решение xamarin для этой проблемы:

    public static bool IsMobileDataEnabled()
    {
        bool result = false;

        try
        {
            Context context = //get your context here or pass it as a param

            if (Build.VERSION.SdkInt >= BuildVersionCodes.JellyBeanMr1)
            {
                //Settings comes from the namespace Android.Provider
                result = Settings.Global.GetInt(context.ContentResolver, "mobile_data", 1) == 1;
            }
            else
            {
                result = Settings.Secure.GetInt(context.ContentResolver, "mobile_data", 1) == 1;
            }
        }
        catch (Exception ex)
        {
            //handle exception
        }

        return result;
    }

PS: Убедитесь, что у вас есть все права для этого кода.

Ответ 7

Вы должны использовать ConnectivityManager, и данные NetworkInfo можно найти здесь

Ответ 8

Я думаю, что использование класса NetworkInfo и isConnected должно работать:

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

return info != NULL || info.isConnected();

И проверить, возможно, подключены мобильные данные. Я не могу быть уверен, пока не проверю его. Которые я не могу сделать до завтра.

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

if(tm .getDataState() == tm .DATA_CONNECTED)
   return true;

Ответ 9

To identify which SIM or slot is making data connection active in mobile, we need to register action android:name="android.net.conn.CONNECTIVITY_CHANGE"  with permission   
uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" &    uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"

    public void onReceive(Context context, Intent intent) 
 if (android.net.conn.CONNECTIVITY_CHANGE.equalsIgnoreCase(intent
                .getAction())) {

IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
 IConnectivityManager service =  IConnectivityManager.Stub.asInterface(b);
NetworkState[] states = service.getAllNetworkState();

 for (NetworkState state : states) {

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

 TelephonyManager mTelephonyManager = (TelephonyManager) context
                        .getSystemService(Context.TELEPHONY_SERVICE);
         int slotList =  { 0, 1 };
          int[] subId = SubscriptionManager.getSubId(slotList[0]);
          if(mTelephonyManager.getDataEnabled(subId[0])) {
             // this means data connection is active for SIM1 similary you 
             //can chekc for SIM2 by slotList[1]
               .................
          }
}

}

Ответ 10

    ConnectivityManager cm = (ConnectivityManager) activity
                        .getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo info = cm.getActiveNetworkInfo();
                String networkType = "";
    if (info.getType() == ConnectivityManager.TYPE_WIFI) {
                    networkType = "WIFI";
                } 
else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {

                    networkType = "mobile";
    }

Ответ 13

Вот простое решение из двух других ответов:

        TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            return tm.isDataEnabled();

        } else {
            return tm.getSimState() == TelephonyManager.SIM_STATE_READY && tm.getDataState() != TelephonyManager.DATA_DISCONNECTED;
        }

Ответ 14

Хорошо, есть обходной путь, чтобы проверить, включено ли соединение для передачи данных. Но я не уверен, будет ли это работать на каждом устройстве. Вы должны это проверить. (Работало на Android одно устройство)

long data = TrafficStats.getMobileRxBytes();
if(data > 0){
    //Data is On
}
else{
    //Data is Off
}

Если вы не знаете об этом методе, он возвращает общее количество байтов, полученных через мобильную сеть с момента загрузки устройства. Когда вы отключите мобильное соединение для передачи данных, оно вернет Ноль (0). Когда вы включите, он снова вернет общее количество байтов. Но вам нужно знать, что существует проблема, которая может возникнуть при использовании этого обходного пути.

  • Этот метод также возвращает 0 при перезагрузке телефона, потому что вычисление начинается с 0 байтов.

Ответ 15

private boolean haveMobileNetworkConnection() {
        boolean haveConnectedMobile = false;

        ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] netInfo = cm.getAllNetworkInfo();

        for (NetworkInfo ni : netInfo) {

            if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
                if (ni.isConnected())
                    haveConnectedMobile = true;
        }
        return haveConnectedMobile;
    }

Примечание. Вам понадобится разрешение android.permission.ACCESS_NETWORK_STATE, чтобы использовать этот код.

Ответ 16

Существует простой API, который, кажется, работает

TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return tm.isDataEnabled();