Comment savoir si ‘Mobile Network Data’ est activé ou désactivé (même connecté en WiFi)?

J’ai une application que je veux pouvoir utiliser pour obtenir un rapport d’état de connexion à partir d’une requête distante.

Je veux savoir si le WiFi est connecté et si l’access aux données est activé sur le réseau mobile.

Si le WiFi est hors de scope, je veux savoir si je peux compter sur le réseau mobile.

Le problème est que les données activées sont toujours renvoyées comme étant vraies lorsque je suis connecté par WiFi, et que je ne peux interroger correctement le réseau mobile que lorsque celui-ci n’est pas connecté par WiFi.

Toutes les réponses que j’ai vues suggèrent d’interroger la connexion actuelle, mais je veux savoir si un réseau mobile est disponible si j’en ai besoin, même si je suis peut-être connecté par WiFi pour le moment.

Est-il possible de dire si les données du réseau mobile sont activées sans interrogation pour voir si elles sont connectées?

MODIFIER

Donc, lorsque je suis connecté par WiFi Si je vais dans les parameters et que je désélectionne «Données activées», puis dans mon application, je le fais:

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

mob_avail est renvoyé comme “true”, mais j’ai désactivé les données du réseau mobile, donc je m’attendrais à ce qu’il soit “faux”

Si j’éteins le WiFi, il n’y a pas (à juste titre) de connexion car j’ai désactivé les données du réseau mobile.

Alors, comment puis-je vérifier si les données du réseau mobile sont activées lorsque je suis connecté par WiFi?

METTRE À JOUR

J’ai regardé getAllNetworkInfo () comme suggéré dans les commentaires de ss1271

J’ai publié les informations renvoyées sur le réseau mobile dans les 3 conditions suivantes

WiFi Off – Données mobiles sur

WiFi On – Données mobiles désactivées

WiFi On – Données mobiles sur

et a obtenu les résultats suivants:

Avec WiFi OFF:

mobile [HSUPA], état: CONNECTED / CONNECTED, raison: inconnue, extra: internet, itinérance: false, reprise en ligne: false, isAvailable: true, featureId: -1, userDefault: false

Avec WiFi On / Mobile OFF

NetworkInfo: type: mobile [HSUPA], état: DISCONNECTED / DISCONNECTED, raison: connectionDisabled, extra: (none), itinérance: false, failover: false, isAvailable: true, featureId: -1, userDefault: false

Avec WiFi On / Mobile On

NetworkInfo: type: mobile [HSPA], état: DISCONNECTED / DISCONNECTED, raison: connectionDisabled, extra: (aucun), itinérance: false, reprise en ligne: false, isAvailable: true, featureId: -1, userDefault: false

Donc, comme vous pouvez le voir, isAvailable a renvoyé la valeur true à chaque fois, et state n’a été affiché que lorsque le WiFi était actif.

CLARIFICATION

Je ne cherche pas à voir si mon téléphone est actuellement connecté à un réseau mobile. J’essaie d’établir si l’utilisateur a activé / désactivé l’access aux données sur le réseau mobile. Ils peuvent l’activer et la désactiver en allant dans Paramètres -> Paramètres réseau et sans fil -> Paramètres réseau mobile -> Données activées

Le code suivant vous indiquera si les “données mobiles” sont activées ou non, qu’il existe ou non une connexion de données mobile active ou que le wifi soit activé / actif ou non. Ce code ne fonctionne que sur Android 2.3 (Gingerbread) et versions ultérieures. En fait, ce code fonctionne également sur les versions antérieures d’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 } 

Remarque: vous devez avoir la permission android.permission.ACCESS_NETWORK_STATE pour pouvoir utiliser ce code.

J’ai amélioré la réponse d’Allesio. Depuis le 4.2.2, le paramètre mobile_data int de Settings.Secure est passé à Settings.Global.

Essayez ce code lorsque vous souhaitez savoir si le réseau mobile est activé même lorsque le wifi est activé et connecté.

Mis à jour pour vérifier si la carte SIM est disponible. Merci d’avoir souligné 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; } } 

L’une des méthodes consiste à vérifier si l’utilisateur a activé les données mobiles dans les parameters, ce qui sera très probablement le cas si le wifi est désactivé. Cela fonctionne (testé), et il n’utilise pas de reflection, bien qu’il utilise une valeur cachée dans l’API:

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

Selon l’API, vous devez vérifier Settings.Global au lieu de Settings.Secure, comme indiqué par @ user1444325.

Source: Appel d’API Android pour déterminer le paramètre utilisateur “Données activées”

Vous pouvez essayer quelque chose comme ça:

 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 vous êtes intéressé si vous êtes vraiment connecté, utilisez

 NetworkInfo.State.CONNECTED 

seulement, au lieu de

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

La fonction @ sNash fonctionne très bien. Mais dans quelques appareils, j’ai trouvé que le résultat était vrai même si les données étaient désactivées. J’ai donc trouvé une solution alternative qui est dans l’API Android.

La méthode getDataState () de TelephonyManager sera très utile.

J’ai mis à jour la fonction de @ snash avec la fonction ci-dessus utilisée. La fonction ci-dessous renvoie false lorsque les données cellulaires sont désactivées sinon true.

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

Vous devez utiliser le ConnectivityManager, et les détails de NetworkInfo peuvent être trouvés ici

Je pense que l’utilisation de la classe NetworkInfo et de isConnected devrait fonctionner:

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

Et pour vérifier les données mobiles est connecté peut-être. Je ne peux pas être sûr jusqu’à ce que je le teste. Ce que je ne peux pas faire jusqu’à demain.

 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(); Ssortingng networkType = ""; if (info.getType() == ConnectivityManager.TYPE_WIFI) { networkType = "WIFI"; } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) { networkType = "mobile"; } 

Voici une solution xamarin à ce problème:

  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: Assurez-vous d’avoir toutes les permissions pour ce code.

Selon la documentation 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();