Чтобы это работало, ваше приложение должно быть подписано системным ключом или иметь привилегию оператора. В противном случае приложение скинет
java.lang.SecurityException: No modify permission or carrier privilege.
Мое приложение работает на Android 5.1 Lollipop (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;
}