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

View previous topic View next topic Go down

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

Post by LauCass on Tue 4 Jan - 12:42

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 Wink

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é Sad

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.

Voici donc un bout de code pour faire ça:

Code:

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

LauCass
Admin

Messages: 1159
Date d'inscription: 2008-08-16
Age: 45
Localisation: Aubagne

View user profile http://laucass.forumactif.org

Back to top Go down

View previous topic View next topic Back to top

- Similar topics

Permissions in this forum:
You cannot reply to topics in this forum