这是针对三星Galaxy Nexus的Verizon LTE版本。
我的任务是编写一个能够有效禁用/启用4G功能的小应用程序。这可以通过settings > mobile network > network mode
手动完成,然后选择LTE/CDMA
(已启用4g)或CDMA
(仅限3g)。
我还没有尝试任何东西,因为Android开发不是我的强项。我正在寻找指导...例子,代码示例等我假设这个应该几乎是一个单行,但我的经验是,使用Android开发没有什么是它看起来那么简单
非常感谢任何帮助。
答案 0 :(得分:5)
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";
您可以对此使用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;
}
}
根据我的研究,如果没有root权限并且在命令行中使用类似setprop
的内容,则无法创建此类应用程序,但即使这样,您也可能需要重新启动整个Telephony进程才能使此设置生效
最后,如果您仍然感兴趣,请参阅com.android.phone.Settings以了解系统如何处理此切换。它相当复杂,正如我所提到的那样,需要权限才能正常的Android应用程序被授予。
答案 1 :(得分:2)
我也有兴趣改变WCDMA,WCDMA / LTE,......的设置。
我找到了使用root权限更改Settings.secure。*的方法,如下所示。
new ExecuteAsRootBase() {
@Override
protected ArrayList<String> getCommandsToExecute() {
ArrayList<String> cmds = new ArrayList<String>();
cmds.add("su -c 'chmod 755 "+mySqlite+"'");
cmds.add("echo \"UPDATE secure SET value='"+ value +"' WHERE name='"+ key +"'; \" | "+mySqlite+" /data/data/com.android.providers.settings/databases/settings.db");
//TODO: SQL injection can be done!!!
return cmds;
}
}.execute();
引入了ExecuteAsRootBase here,而mySqlite是“/data/data/"+context.getPackageName()+"/iles/sqlite3”,其中sqlite3是预先提交的。
然而,似乎我们必须在设置Settings.secure后调用com.android.internal.telephony.Phone。 setPreferredNetworkType ()进行切换(WCDMA only&lt; =&gt; WCDMA / LTE) .PREFERRED_NETWORK_MODE。 我的手机(甚至设置Settings.secure.PREFERRED_NETWORK_MODE = 2)连接到LTE网络......
答案 2 :(得分:1)
所有其他答案都是正确的,这需要访问Settings.Secure。请查看手机应用如何处理此设置https://github.com/dzo/packages_apps_phone/blob/master/src/com/android/phone/Use2GOnlyCheckBoxPreference.java
或者查看Toggle2G
应用来源:
https://github.com/TheMasterBaron/Toggle-2G
答案 3 :(得分:-1)
http://developer.android.com/reference/android/provider/Settings.System.html
除了在Activity.java中编写代码之外,您可能还需要获得访问AndroidManifest.xml中这些设置的权限。所以它很烦人,但应该足够简单。