¿Cómo saber si ‘Mobile Network Data’ está habilitado o deshabilitado (incluso cuando está conectado por WiFi)?

Tengo una aplicación que deseo poder utilizar para obtener un informe de estado de la conexión desde una consulta remota.

Quiero saber si WiFi está conectado y si el acceso a datos está habilitado en la red móvil.

Si el WiFi se sale de rango, quiero saber si puedo confiar en la red móvil.

El problema es que los datos habilitados siempre se devuelven como verdaderos cuando estoy conectado por WiFi, y solo puedo consultar correctamente la red móvil cuando no estoy conectado por WiFi.

todas las respuestas que he visto sugieren una encuesta para ver cuál es la conexión actual, pero quiero saber si la red móvil está disponible si la necesito, aunque podría estar conectado por WiFi en este momento.

¿Hay alguna forma de decir si los datos de la red móvil están habilitados sin sondeo para ver si están conectados?

EDITAR

Entonces, cuando estoy conectado a WiFi, si voy a la configuración y deselecciono ‘Data Enabled’ y luego en mi aplicación, hago esto:

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

mob_avail se devuelve como ‘verdadero’, pero he desactivado los datos de red móvil, por lo que esperaría que fuera ‘falso’

Si apago el WiFi, no hay (correctamente) conexión ya que he desactivado los datos de la red móvil.

Entonces, ¿cómo puedo verificar si los datos de la red móvil están habilitados cuando estoy conectado por WiFi?

ACTUALIZAR

Eché un vistazo a getAllNetworkInfo () como se sugiere en los comentarios de ss1271

Imprimí la información devuelta sobre la red móvil en las siguientes 3 condiciones

WiFi desactivado: datos móviles en

WiFi activado: datos móviles desactivados

WiFi activado: datos móviles en

y obtuve los siguientes resultados:

Con WiFi desactivado:

móvil [HSUPA], estado: CONECTADO / CONECTADO, razón: desconocido, extra: internet, roaming: falso, failover: falso, isAvailable: true, featureId: -1, userDefault: falso

Con WiFi On / Mobile desactivado

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

Con WiFi On / Mobile On

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

Como puede ver, isAvailable devuelve true cada vez, y el estado solo se muestra como desconectado cuando WiFi estaba en efecto.

ACLARACIÓN

No estoy buscando si mi teléfono está actualmente conectado a una red móvil. ESTOY tratando de establecer si el usuario ha habilitado / deshabilitado el acceso a datos a través de la red móvil. Pueden activarlo y desactivarlo yendo a Configuración -> Configuración inalámbrica y de red -> Configuración de red móvil -> Datos habilitados

El siguiente código le dirá si los “datos móviles” están habilitados o no, independientemente de si hay una conexión de datos móviles activa o no activada o si wifi está habilitado / activo o no. Este código solo funciona en Android 2.3 (Gingerbread) y más tarde. En realidad, este código también funciona en versiones anteriores de 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 } 

Nota: deberá tener permiso android.permission.ACCESS_NETWORK_STATE para poder usar este código.

Actualicé la respuesta de Allesio. Configuración. Mobile_data int de Secure se ha movido a Settings.Global desde 4.2.2.

Pruebe este código cuando desee saber si la red móvil está habilitada incluso cuando wifi está habilitado y conectado.

Actualizado para verificar si la Tarjeta SIM está disponible. Gracias por señalar a murat.

 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; } } 

Una forma es verificar si el usuario tiene datos móviles activados en la configuración, lo que probablemente se utilizará si wifi se apaga. Esto funciona (probado) y no utiliza la reflexión, aunque utiliza un valor oculto en la API:

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

Dependiendo de la API, debe verificar Settings.Global en lugar de Settings.Secure, como lo señala @ user1444325.

Fuente: llamada a la API de Android para determinar la configuración del usuario “Datos habilitados”

Puedes intentar algo como eso:

 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 } 

Si le interesa si está realmente conectado, use

 NetworkInfo.State.CONNECTED 

solo, en lugar de

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

La función de @sNash funciona muy bien. Pero en pocos dispositivos encontré que devuelve verdadero incluso si los datos están deshabilitados. Entonces encontré una solución alternativa que está en Android API.

El método getDataState () de TelephonyManager será muy útil.

Actualicé la función de @ snash con la función anterior utilizada. La función siguiente devuelve falso cuando los datos móviles están deshabilitados.

 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; } 

Debe usar ConnectivityManager, y los detalles de NetworkInfo se pueden encontrar aquí

Creo que el uso de la clase NetworkInfo y isConnected debería funcionar:

 ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); return info != NULL || info.isConnected(); 

Y para verificar los datos móviles está conectado tal vez. No puedo estar seguro hasta que lo pruebe. Lo cual no puedo hacer hasta mañana.

 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"; } 

Aquí hay una solución de xamarin para este problema:

  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; } 

PD: asegúrese de tener todos los permisos para este código.

De acuerdo con la documentación de 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();