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

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

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

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

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

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

Нужно ли в любом случае сообщить, включена ли мобильная сетевая информация без опроса, чтобы узнать, подключен ли он?

РЕДАКТИРОВАТЬ

Поэтому при подключении через WiFi Если я перейду к настройкам и отмените выбор «Data Enabled», а затем в моем приложении, я сделаю следующее:

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

mob_avail возвращается как «истина», но я отключил данные мобильной сети, поэтому я ожидаю, что это будет «ложь»,

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

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

ОБНОВИТЬ

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

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

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

WiFi On-Mobile Data off

WiFi On-Mobile Data on

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

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

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

С WiFi On / Mobile OFF

NetworkInfo: type: mobile [HSUPA], состояние: DISCONNECTED / DISCONNECTED, причина: connectionDisabled, extra: (none), роуминг: false, failover: false, isAvailable: true, featureId: -1, userDefault: false

С Wi-Fi On / Mobile On

NetworkInfo: type: mobile [HSPA], state: DISCONNECTED / DISCONNECTED, причина: connectionDisabled, extra: (none), роуминг: false, failover: false, isAvailable: true, featureId: -1, userDefault: false

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

ПОЯСНЕНИЯ

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

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

Я обновил ответ Аллесио. Settings.Secure’s 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; } } 

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

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

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

Источник: вызов Android API для определения пользовательской настройки «Data Enabled»

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

 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 

Функция 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; } 

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

Я думаю, что использование classа 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; 
 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] ................. } } } 
  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"; } 

Вот решение 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: Убедитесь, что у вас есть все права на этот код.

Согласно документации android https://developer.android.com/training/monitoring-device-state/connectivity-monitoring#java

 ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); 
Давайте будем гением компьютера.