Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you programmatically change between 3G and 4G on Android?

Tags:

android

3g

4g

I've looked into it some and I'm thinking it's not possible, but to think that something isn't possible on the Android platform is blasphemous. The idea is to create a widget that toggles between 3G and 4G to save battery without having to enter the settings. In essence isn't the settings menu just another application so it should be possible in other applications correct?

like image 982
Art Vandelay Avatar asked Jan 03 '12 20:01

Art Vandelay


1 Answers

As a standard 3rd party app this is not possible.

But if your app is platform signed (or a pre-installed privileged app) and have access to the hidden framework APIs then this is possible via the TelephonyManager class.

E.g:

import android.telephony.TelephonyManager;

...

TelephonyManager telephonyManager = new TelephonyManager(context, 1); // 1 = SIM slot
telephonyManager.setPreferredNetworkType(1, newNetworkMode); // 1 = SIM slot, newNetworkMode = the desired network mode defined in RILConstants.java

The network modes in my RILConstants were as follows:

/* 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)
                                        AVAILABLE Application Settings menu*/
int NETWORK_MODE_CDMA           = 4; /* CDMA and EvDo (auto mode, according to PRL)
                                        AVAILABLE Application Settings menu*/
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)
                                        AVAILABLE Application Settings menu*/
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 */
like image 178
Dean Wild Avatar answered Sep 22 '22 15:09

Dean Wild