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

2

7

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?

Estrade answered 3/1, 2012 at 20:52 Comment(2)
The settings menu is just another application, but signed with a system certificate. This grants additional rights which are not available to normal apps. Unless you build your own firmware.Tops
Welcome to StackOverflow. Please resist the temptation to post flame-bait or purely noise verbiage here. We try and keep this site clean of the extraneous clutter so it remains a useful resource. If you want to post flamebait or noise, try creating a blog instead. Thanks.Biggerstaff
S
2

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 */
Sartorius answered 24/8, 2020 at 11:22 Comment(0)
P
1

There are no APIs surfaced in the SDK that permit you to do this. That's not to say that Android doesn't support network selection preferences; it just means that Google hasn't seen fit to grant mere mortals (app developers) access to the requisite APIs, as alextsc_off alludes to.

Putamen answered 22/1, 2012 at 12:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.