这是针对Verizon版本的三星Galaxy。
我的任务是编写一个小应用程序,它将有效地禁用/启用4G功能。这可以通过settings > mobile network > network mode手动完成,并选择LTE/CDMA (启用4G)或CDMA (仅限3G)。
我还没有尝试任何东西,因为Android开发不是我的强项。我在找指引..。示例、代码示例等等。我认为这几乎应该是一条直线,但我的经验是,在Android开发中,没有任何事情像它看上去那么简单。
任何帮助都将不胜感激。
发布于 2012-01-02 20:30:52
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中,需要反射才能访问。
在TelephonyManager中还有另一个隐藏方法,但是它仍然是只读的,没有其他方法来设置这个常量。这将准确地告诉您想要知道的内容,设备是设置为"LTE/ CDMA“(LTE_ON_CDMA_TRUE)还是"CDMA only”(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;
}
}根据我的研究,在没有根访问和使用类似于命令行的setprop的情况下,您无法创建这样的应用程序,但即使这样,您也可能需要重新启动整个电话进程才能使此设置生效。
最后,如果您仍然感兴趣,请参见com.android.phone.Settings查看系统如何处理此切换。这是相当详细的,正如我所提到的,将需要一个正常的Android应用程序不会被授予的权限。
发布于 2012-06-16 18:21:05
我也有兴趣改变设置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();"/data/data/"+context.getPackageName()+"/files/sqlite3“引入了ExecuteAsRootBase,mySqlite是这里,mySqlite是预先放置sqlite3的mySqlite。
然而,在设置com.android.internal.telephony.Phone.setPreferredNetworkType()后,似乎必须调用Settings.secure.PREFERRED_NETWORK_MODE进行交换(WCDMA仅为<=>WCDMA/LTE)。我的手机(甚至设置Settings.secure.PREFERRED_NETWORK_MODE = 2)连接到LTE网络.
发布于 2013-04-15 10:14:31
所有其他答案都是正确的,这需要访问Settings.Secure。看看手机应用程序如何处理这个设置phone/blob/master/src/com/android/phone/Use2GOnlyCheckBoxPreference.java
或者看一下Toggle2G应用程序的源代码:https://github.com/TheMasterBaron/Toggle-2G
https://stackoverflow.com/questions/8607263
复制相似问题