首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android4.0 4G开关

Android4.0 4G开关
EN

Stack Overflow用户
提问于 2011-12-22 16:57:17
回答 4查看 8.1K关注 0票数 5

这是针对Verizon版本的三星Galaxy。

我的任务是编写一个小应用程序,它将有效地禁用/启用4G功能。这可以通过settings > mobile network > network mode手动完成,并选择LTE/CDMA (启用4G)或CDMA (仅限3G)。

我还没有尝试任何东西,因为Android开发不是我的强项。我在找指引..。示例、代码示例等等。我认为这几乎应该是一条直线,但我的经验是,在Android开发中,没有任何事情像它看上去那么简单。

任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

发布于 2012-01-02 20:30:52

Settings.Secure类中有一个对SDK隐藏的首选项:

代码语言:javascript
复制
    /**
     * 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):

代码语言:javascript
复制
/**
 * 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应用程序不会被授予的权限。

票数 5
EN

Stack Overflow用户

发布于 2012-06-16 18:21:05

我也有兴趣改变设置WCDMA-只,WCDMA/LTE,.

我找到了用root权限更改Settings.secure.*的方法,如下所示。

代码语言:javascript
复制
    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网络.

票数 2
EN

Stack Overflow用户

发布于 2013-04-15 10:14:31

所有其他答案都是正确的,这需要访问Settings.Secure。看看手机应用程序如何处理这个设置phone/blob/master/src/com/android/phone/Use2GOnlyCheckBoxPreference.java

或者看一下Toggle2G应用程序的源代码:https://github.com/TheMasterBaron/Toggle-2G

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8607263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档