有一个在Settings.Secure类的偏好是从SDK隐藏:
/**
* 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中,并且需要Reflection才能访问。
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应用程序。
来源
2012-01-02 20:30:52
Tom
据我所知,普通的Android SDK应用程序无法改变这一点。 – CommonsWare 2011-12-22 17:01:07
啊,很有意思。我希望情况并非如此。现在研究。我听说HTC手机存在一个小部件,这让我相信它可以完成。 – 2011-12-22 17:13:10
如果有问题的应用程序小部件附带HTC手机,那不是普通的Android SDK应用程序。 – CommonsWare 2011-12-22 17:15:00