3 votes

Ne pas recevoir l'événement de changement d'état du mobile lorsque le wi-fi est activé

J'ai besoin d'être informé lorsque les données mobiles sont activées/désactivées. Pour cela, j'utilise BroadcastReceiver et je m'inscris à l'événement ConnectivityManager.CONNECTIVITY_ACTION. Cependant, cet événement n'est déclenché que lorsque le Wi-Fi est désactivé. Dès que j'active le Wi-Fi, je ne reçois plus d'événement lors de l'activation/désactivation des données mobiles.

Des idées ? Je dois recevoir l'événement de changement d'état des données mobiles indépendamment de l'état du wi-fi.

0voto

Nargis Points 2539
  1. Écoutez ConnectivityManager.CONNECTIVITY_ACTION

  2. Dans votre Broadcast Receiver vérifier l'intention reçue et obtenir des informations sur le réseau

    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
        final NetworkInfo networkInfo = 
            intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
  3. Vérifiez si

    if ((networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) && !networkInfo.isConnected()

    Les données mobiles ne sont pas disponibles

  4. Autres cas de figure

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

    Les données mobiles sont disponibles

Pour mettre à jour votre interface utilisateur, vous pouvez lire l'état actuel de Mobile Data en utilisant Connectivity Manager comme :

ConnectivityManager cm = (ConnectivityManager)applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE);

public boolean isNetworkAvailable() {
        boolean status = false;
        try {

            final NetworkInfo netInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            if ((netInfo != null) && (netInfo.getState() == NetworkInfo.State.CONNECTED)) {
                status = true;
            }
        } catch (final Exception e) {
            TLog.e(LOG, "Error Getting Mobile Network State");
            return false;
        }
        return status;

    }

0voto

James Grant Points 217

Le problème est que lorsqu'un utilisateur est connecté au WiFi, l'appareil cesse d'utiliser les données mobiles. L'activation et la désactivation n'auront donc aucun effet.

ConnectivityManager.CONNECTIVITY_ACTION ne fait que notifier les connexions établies ou perdues. Ainsi, lorsque vous êtes en WiFi, il n'y a pas de connexion au réseau mobile pour détecter ces changements, qu'elle soit activée ou désactivée.

Pour cette raison, je ne suis pas sûr qu'il sera possible de détecter les changements d'état des données mobiles lorsque l'on est connecté au WiFi.

0voto

bmartins Points 982

Je ne suis pas sûr que vous puissiez vous fier à la notification de ConnectivityManager.CONNECTIVITY_ACTION dans ce cas précis.

Mais, si vous voulez savoir si le paramètre de données mobiles est activé/désactivé à un moment donné.

Vous pouvez utiliser les éléments suivants :

ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

Method method = conn.getClass().getDeclaredMethod("getMobileDataEnabled");

boolean isMobileDataEnabled = (Boolean)method.invoke(conn);

0voto

ChangUZ Points 1548

J'ai testé deux récepteurs d'action.

1.

ConnectivityManager.CONNECTIVITY_ACTION;

Il ne peut pas recevoir de données mobiles activées ou désactivées si le wifi est connecté.

2.

TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED = "android.intent.action.ANY_DATA_STATE" 

(Il est caché)

Il peut recevoir des données mobiles désactivées si le wifi est connecté. et ne peut pas recevoir de données mobiles.

Mon appareil de test est le Samsung Galaxy S4 mini LTE modèle coréen (SHV-E370K) et non le modèle global (GT-I9195).

\==========================================

Si le wifi est connecté, le système n'appelle pas dataEnabled (car il n'a pas besoin de données mobiles).

Il ne peut donc pas recevoir l'état d'activation du mobile (en fait, les données mobiles ne sont PAS activées).

J'ai décidé de programmer un minuteur (période = 10000ms) et de vérifier getMobileDataEnabled() .

private Method connectivityManager_getMobileDataEnabled = null;
private Method getConnectivityManager_getMobileDataEnabled() throws NoSuchMethodException {

    if (connectivityManager_getMobileDataEnabled == null) {
        connectivityManager_getMobileDataEnabled = ConnectivityManager.class.getMethod(
                "getMobileDataEnabled",
                new Class[0]);
    }

    return connectivityManager_getMobileDataEnabled;
}

public boolean getMobileDataEnabled() 
        throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

    Method getMobileDataEnabled = getConnectivityManager_getMobileDataEnabled();
    getMobileDataEnabled.setAccessible(true);
    return (Boolean) getMobileDataEnabled.invoke(mConnectivityManager);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X