android - scan - ¿Cómo saber si ''Mobile Network Data'' está habilitado o deshabilitado(incluso cuando está conectado por WiFi)?
wifi en android studio (10)
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
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;
}
}
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.
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;
Debe usar ConnectivityManager, y los detalles de NetworkInfo se pueden encontrar here
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.
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.
getDataState() 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;
}
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
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"
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";
}
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]
.................
}
}
}