Aller au contenu

Activer/Désactiver les data (2G/3G) sans modifier les APN


LauCass

Recommended Posts

Après des mois de recherche (pas à plein temps je vous rassure ^^) sur comment activer/désactiver les data, sans modifier la configuration APN, j'ai enfin trouvé une solution dont je voudrais faire profiter ceux qui seraient éventuellement dans mon cas ;)

Je savais que c'était possible car des applications comme Quick Settings le font et je voulais vraiment avoir cette solution dans le widget Switcher de mon application AndroMax, mais impossible de trouver cette information sur le web, même dans le source code de Quick Settings (dispo sur: http://code.google.com), le bout de code qui fait ça a été retiré :(

J'ai donc cherché du côté du source code d'Android pour comprendre comment tout cela fonctionne et après avoir buté sur le fait qu'on ne peut pas désactiver proprement la connexion data sans être une application système, comme le fait le menu système sous Froyo. En descendant plus bas j'ai donc trouvé qu'il était possible de changer l'état de la connexion au niveau de l'interface ITelephony en utilisant une permission qui elle ne nécessite pas d'être une application système. Je pense que c'est d'ailleurs ce qui est utilisé par Quick Settings car le comportement est similaire.

Cette solution ne fonctionne pas sur Gingerbread car la sécurité a été renforcée, si quelqu'un connait un autre hack pour Gingerbread, j'achète ;)

Voici donc un bout de code pour faire ça:

import java.lang.reflect.Method;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;

import com.laucass.andromax.ApnManager;

// Needs the following permissions:
// - "android.permission.MODIFY_PHONE_STATE"

public final class DataConManager 
{
   private TelephonyManager m_telManager = null;
   private ConnectivityManager m_conManager = null;

   // ------------------------------------------------------
   // ------------------------------------------------------
   public DataConManager(Context context)
   {
       try
       {
           // Get phone and connectivity services
           m_telManager = (TelephonyManager)context.getSystemService("phone");
           m_conManager = (ConnectivityManager)context.getSystemService("connectivity");
       }
       catch (Exception e)
       {
           m_telManager = null;
           m_conManager = null;
       }
   }

   // ------------------------------------------------------
   // ------------------------------------------------------
   boolean switchState(boolean enable) 
   {
   	boolean bRes = false;

       // Data Connection mode (only if correctly initialized)
   	if (m_telManager != null)
       {
           try
           {
               // Will be used to invoke hidden methods with reflection
   	        Class cTelMan = null;
   	        Method getITelephony = null;
   	        Object oTelephony = null;
   	        Class cTelephony = null;
   	        Method action = null;

   	        // Get the current object implementing ITelephony interface
   	        cTelMan = m_telManager.getClass();
   	        getITelephony = cTelMan.getDeclaredMethod("getITelephony");
   	        getITelephony.setAccessible(true);
   	        oTelephony = getITelephony.invoke(m_telManager);

   	        // Call the enableDataConnectivity/disableDataConnectivity method
   	        // of Telephony object
   	        cTelephony = oTelephony.getClass();
   	        if (enable)
   	        {
                   action = cTelephony.getMethod("enableDataConnectivity");
   	        }
   	        else
   	        {
   	            action = cTelephony.getMethod("disableDataConnectivity");
   	        }
   	        action.setAccessible(true);
   	        bRes = (Boolean)action.invoke(oTelephony);
           }
           catch (Exception e)
   	    {
               bRes = false;
           }
       }

   	return bRes;
   } 

   // ------------------------------------------------------
   // ------------------------------------------------------
   public boolean isEnabled()
   {
   	boolean bRes = false;

       // Data Connection mode (only if correctly initialized)
       if (m_conManager != null)
       {
           try       
           {
   	        // Get Connectivity Service state
   	        NetworkInfo netInfo = m_conManager.getNetworkInfo(0);

   	        // Data is enabled if state is CONNECTED
   	        bRes = (netInfo.getState() == NetworkInfo.State.CONNECTED);
           }
           catch (Exception e)
           {
   	        bRes = false;
           }
       }     

   	return bRes;
   }
}

Modifié par LauCass
Lien vers le commentaire
Partager sur d’autres sites

  • 6 months later...

Bonjour,

J'avais mis ce sujet dans les favorid, dans l'espoir d'une réponse. Même s'il commence à dater, cela peut peut être intéresser du monde.

J'ai re-testé "Data enabler Widget" hier, et il fait exactement ça (activer/désactiver les data, sans modifier la configuration APN). Il doit surement y avoir d'autres applications qui doivent le faire maintenant.

Je suis sur un Nexus S en 2.3.4

bonne journée,

Modifié par vmik9
Lien vers le commentaire
Partager sur d’autres sites

  • 2 months later...
  • 3 months later...

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...