在 SDK 中隐藏的Settings.Secure类中有一个首选项:
/**
* The preferred network mode 7 = Global
* 6 = EvDo only
* 5 = CDMA w/o EvDo
* 4 = CDMA / EvDo auto
* 3 = GSM / WCDMA auto
* 2 = WCDMA only
* 1 = GSM only
* 0 = GSM / WCDMA preferred
* @hide
*/
public static final String PREFERRED_NETWORK_MODE =
"preferred_network_mode";
您可以对此使用反射,也可以将常量本地化到您的项目中。这样做的问题是您无法更改此设置的值(与所有安全设置一样),您只能读取它。上述值并不是唯一可能的值,实际上还有一些位于 com.android.internal.telephony.RILConstants 中,它们再次对 SDK 隐藏,需要反射才能访问。
TelephonyManager中还有另一个隐藏方法,但它也是只读的,没有其他方法可以设置此常量。这将准确地告诉您您想知道的内容,无论设备设置为“LTE/CDMA”(LTE_ON_CDMA_TRUE)还是“仅限CDMA”(LTE_ON_CDMA_FALSE):
/**
* Return if the current radio is LTE on CDMA. This
* is a tri-state return value as for a period of time
* the mode may be unknown.
*
* @return {@link Phone#LTE_ON_CDMA_UNKNOWN}, {@link Phone#LTE_ON_CDMA_FALSE}
* or {@link Phone#LTE_ON_CDMA_TRUE}
*
* @hide
*/
public int getLteOnCdmaMode() {
try {
return getITelephony().getLteOnCdmaMode();
} catch (RemoteException ex) {
// Assume no ICC card if remote exception which shouldn't happen
return Phone.LTE_ON_CDMA_UNKNOWN;
} catch (NullPointerException ex) {
// This could happen before phone restarts due to crashing
return Phone.LTE_ON_CDMA_UNKNOWN;
}
}
根据我的研究,如果没有 root 访问权限并使用命令行之类的东西,您无法制作这样的应用程序setprop
,但即便如此,您可能需要重新启动整个 Telephony 进程才能使此设置生效。
最后,如果您仍然感兴趣,请查看 com.android.phone.Settings 以了解系统如何处理此切换。它相当复杂,正如我提到的那样,它需要普通 Android 应用程序不会获得的权限。