我想要更改首选的网络模式。gsm或wcdma或自动,以编程方式,从代码,在Android上。
这是可能的吗?如果是的话,是如何实现的?
发布于 2012-04-16 15:33:52
答案是NO
我们可以直接打开移动网络设置的设置应用程序,在"2G“和”允许3G“网络之间切换,但遗憾的是,直接切换是不可能的。
我们可以开发一些东西,将显示当前的网络,并允许用户从应用程序的捷径,他们可以切换网络。
发布于 2016-08-13 04:57:34
这是可能的,我做到了。
为此,您的应用程序必须使用系统密钥进行签名,或者具有承运商权限。否则应用程序将抛出java.lang.SecurityException: No modify permission or carrier privilege.
我的应用程序运行在安卓5.1棒棒糖(API 22)上,并使用系统密钥签名,所以这是我唯一能确认有效的配置。我不能确认航母特权的方法。
AndroidManifest.xml
将此权限添加到您的应用程序清单。如果您使用的是Android Studio,它可能会将此行标记为错误,因为只有系统应用程序才能拥有此权限。如果您可以使用系统密钥为您的应用程序签名,请不要担心。
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>获取首选网络
返回在RILConstants.java中定义,例如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;
}设置首选方法。
参数必须以RILConstants.java为基础,例如: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();
}
}这是用于访问隐藏API方法的实用程序方法。
/**
* 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;
}发布于 2017-01-13 14:42:57
这不是一个答案,而是对Tulio-F的答案进行扩展。
RILConstants.java包含以下内容:
// 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"
https://stackoverflow.com/questions/10170179
复制相似问题