这是针对三星Galaxy Nexus的Verizon LTE版本.
我的任务是编写一个能够有效禁用/启用4G功能的小应用程序.这可以通过手动完成settings > mobile network > network mode并选择LTE/CDMA(4g启用)或CDMA(仅3g).
我还没有尝试任何东西,因为Android开发不是我的强项.我正在寻找指导...示例,代码示例等我假设这应该是一个单行,但我的经验是,使用Android开发没有什么是它看起来那么简单.
任何帮助将不胜感激.
在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";
Run Code Online (Sandbox Code Playgroud)
您可以在此处使用Reflection,或者只将常量本地化为您的项目.这样做的问题是您无法更改此设置的值(与所有安全设置一样),您只能读取它.上述值不是唯一可能的值,实际上还有一些位于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;
}
}
Run Code Online (Sandbox Code Playgroud)
根据我的研究,如果没有root访问权限并使用类似setprop命令行的东西,你就无法创建这样的应用程序,但即使这样,你也可能需要重新启动整个Telephony进程才能使此设置生效.
最后,如果您仍然感兴趣,请参阅com.android.phone.Settings以查看系统如何处理此切换.它相当精细,正如我所提到的那样,需要权限才能获得普通的Android应用程序.
小智 -1
http://developer.android.com/reference/android/provider/Settings.System.html
除了在 Activity.java 中编写代码之外,您可能还需要请求访问 AndroidManifest.xml 中这些设置的权限。所以这很烦人,但应该足够简单。
| 归档时间: |
|
| 查看次数: |
7753 次 |
| 最近记录: |