有一個在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