Изменение режима мобильной сети (gsm, wcdma, auto)
Я хочу изменить предпочтительный сетевой режим ie. gsm или wcdma или auto, программно, из кода, на Android.
Возможно ли это, и если да, то как ?
3 ответа:
Ответ Нет
Мы можем открыть непосредственно приложение Настройки настроек мобильной сети для переключения между сетями" 2G "и" разрешить 3G".Прямое переключение, к сожалению, невозможно.
Мы можем разработать что-то, что покажет текущую сеть и позволит пользователю быстро отключиться от приложения, где он может переключать сеть.
Возможно, я это сделал.
Чтобы это работало, ваше приложение должно быть подписано системным ключом или иметь привилегию оператора. В противном случае приложение будет выбрасывать
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; }
Это не ответ, а расширение ответа Тулио-Ф.
Рильконстанты .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"