Changer le mode réseau mobile (gsm, wcdma, auto))

je veux changer le mode réseau préféré, c'est-à-dire. GSM ou wcdma ou auto, programmatiquement, à partir du code, sur Android.

Est-ce possible, et si oui, comment ?

12
demandé sur JonasCz 2012-04-16 11:29:53

3 réponses

Réponse NO

nous pouvons ouvrir directement l'application de paramétrage des réseaux mobiles pour passer des réseaux" 2G "aux réseaux" allow 3G".Un interrupteur direct n'est malheureusement pas possible.

nous pouvons développer quelque chose qui montrera le réseau actuel et permettra à l'utilisateur raccourci de l'application où ils peuvent changer de réseau.

3
répondu MKJParekh 2012-04-16 07:33:52

C'est possible, je l'ai fait.

Pour que cela fonctionne, votre application être signée avec la clé de système ou avoir le privilège de porteuse. Sinon l'application lancera java.lang.SecurityException: No modify permission or carrier privilege.

mon application tourne sur Android 5.1 Lollipop (API 22) et est signée avec la touche système, donc c'est la seule configuration que je peux confirmer avec certitude que cela fonctionne. Je ne peux pas confirmer le transporteur privilège approche.

AndroidManifest.xml

ajouter cette permission à votre manifeste de l'application. Si vous utilisez Android Studio, il sera probablement marquer cette ligne comme une erreur parce que seules les applications système peuvent avoir cette permission. Si vous pouvez signer votre application avec les clés du système, ne vous inquiétez pas.

<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>

Obtenir De Réseau Préféré

le retour est défini dans RILConstants.java, par exemple,RILConstants.NETWORK_MODE_WCDMA_PREF

public int getPreferredNetwork() {
    Method method = getHiddenMethod("getPreferredNetworkType", TelephonyManager.class, null);
    int preferredNetwork = -1000;
    try {
        preferredNetwork = (int) method.invoke(mTelephonyManager);
        Log.i(TAG, "Preferred Network is ::: " + preferredNetwork);
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }

    return preferredNetwork;
}

Définir La Méthode Préférée.

Le paramètre doit être fondée sur RILConstants.java, e.g.:RILConstants.NETWORK_MODE_LTE_ONLY

public void setPreferredNetwork(int networkType) {
    try {
        Method setPreferredNetwork = getHiddenMethod("setPreferredNetworkType",
                TelephonyManager.class, new Class[] {int.class});
        Boolean success = (Boolean)setPreferredNetwork.invoke(mTelephonyManager,
                networkType);
        Log.i(TAG, "Could set Network Type ::: " + (success.booleanValue() ? "YES" : "NO"));
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

Ceci est un méthode utilitaire pour accéder aux méthodes API cachées.

/**
 * Get a hidden method instance from a class
 * @param methodName The name of the method to be taken from the class
 * @param fromClass The name of the class that has the method
 * @return A Method instance that can be invoked
 */
public Method getHiddenMethod(String methodName, Class fromClass, Class[] params) {
    Method method = null;
    try {
        Class clazz = Class.forName(fromClass.getName());
        method = clazz.getMethod(methodName, params);
        method.setAccessible(true);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }

    return method;
}
8
répondu Tulio F. 2016-12-08 15:27:26

ce n'est pas une réponse, mais une extension de la réponse de Tulio-F.

RILConstants.java contenir les éléments suivants:

// NETWORK_MODE_* See ril.h RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE 
int NETWORK_MODE_WCDMA_PREF              = 0;   // GSM/WCDMA (WCDMA preferred) 
int NETWORK_MODE_GSM_ONLY                = 1;   // GSM only 
int NETWORK_MODE_WCDMA_ONLY              = 2;   // WCDMA only 
int NETWORK_MODE_GSM_UMTS                = 3;   // GSM/WCDMA (auto mode, according to PRL)**    
int NETWORK_MODE_CDMA                    = 4;   // CDMA and EvDo (auto mode, according to PRL)**
int NETWORK_MODE_CDMA_NO_EVDO            = 5;   // CDMA only 
int NETWORK_MODE_EVDO_NO_CDMA            = 6;   // EvDo only 
int NETWORK_MODE_GLOBAL                  = 7;   // GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL)**
int NETWORK_MODE_LTE_CDMA_EVDO           = 8;   // LTE, CDMA and EvDo 
int NETWORK_MODE_LTE_GSM_WCDMA           = 9;   // LTE, GSM/WCDMA 
int NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA = 10;  // LTE, CDMA, EvDo, GSM/WCDMA 
int NETWORK_MODE_LTE_ONLY                = 11;  // LTE Only mode. 
int NETWORK_MODE_LTE_WCDMA               = 12;  // LTE/WCDMA 
int NETWORK_MODE_TDSCDMA_ONLY            = 13;  // TD-SCDMA only 
int NETWORK_MODE_TDSCDMA_WCDMA           = 14;  // TD-SCDMA and WCDMA 
int NETWORK_MODE_LTE_TDSCDMA             = 15;  // TD-SCDMA and LTE 
int NETWORK_MODE_TDSCDMA_GSM             = 16;  // TD-SCDMA and GSM 
int NETWORK_MODE_LTE_TDSCDMA_GSM         = 17;  // TD-SCDMA,GSM and LTE 
int NETWORK_MODE_TDSCDMA_GSM_WCDMA       = 18;  // TD-SCDMA, GSM/WCDMA 
int NETWORK_MODE_LTE_TDSCDMA_WCDMA       = 19;  // TD-SCDMA, WCDMA and LTE 
int NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA   = 20;  // TD-SCDMA, GSM/WCDMA and LTE 
int NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA     = 21;  // TD-SCDMA,EvDo,CDMA,GSM/WCDMA
int NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 22;  // TD-SCDMA/LTE/GSM/WCDMA, CDMA, and EvDo

int PREFERRED_NETWORK_MODE   = SystemProperties.getInt("ro.telephony.default_network", NETWORK_MODE_WCDMA_PREF);

Où:

** = "AVAILABLE Application Settings menu"

1
répondu not2qubit 2017-01-13 06:42:57