首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改移动网络模式(gsm、wcdma、auto)

更改移动网络模式(gsm、wcdma、auto)
EN

Stack Overflow用户
提问于 2012-04-16 15:29:54
回答 4查看 17K关注 0票数 13

我想要更改首选的网络模式。gsm或wcdma或自动,以编程方式,从代码,在Android上。

这是可能的吗?如果是的话,是如何实现的?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-16 15:33:52

答案是NO

我们可以直接打开移动网络设置的设置应用程序,在"2G“和”允许3G“网络之间切换,但遗憾的是,直接切换是不可能的。

我们可以开发一些东西,将显示当前的网络,并允许用户从应用程序的捷径,他们可以切换网络。

票数 3
EN

Stack Overflow用户

发布于 2016-08-13 04:57:34

这是可能的,我做到了。

为此,您的应用程序必须使用系统密钥进行签名,或者具有承运商权限。否则应用程序将抛出java.lang.SecurityException: No modify permission or carrier privilege.

我的应用程序运行在安卓5.1棒棒糖(API 22)上,并使用系统密钥签名,所以这是我唯一能确认有效的配置。我不能确认航母特权的方法。

AndroidManifest.xml

将此权限添加到您的应用程序清单。如果您使用的是Android Studio,它可能会将此行标记为错误,因为只有系统应用程序才能拥有此权限。如果您可以使用系统密钥为您的应用程序签名,请不要担心。

代码语言:javascript
复制
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>

获取首选网络

返回在RILConstants.java中定义,例如RILConstants.NETWORK_MODE_WCDMA_PREF

代码语言:javascript
复制
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;
}

设置首选方法。

参数必须以RILConstants.java为基础,例如:RILConstants.NETWORK_MODE_LTE_ONLY

代码语言:javascript
复制
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();
    }
}

这是用于访问隐藏API方法的实用程序方法。

代码语言:javascript
复制
/**
 * 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;
}
票数 9
EN

Stack Overflow用户

发布于 2017-01-13 14:42:57

这不是一个答案,而是对Tulio-F的答案进行扩展。

RILConstants.java包含以下内容:

代码语言:javascript
复制
// 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);

其中:

** = "AVAILABLE Application Settings menu"

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10170179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档