Android 4.0 4G切换

时间:2011-12-22 16:57:18

标签: android 4g

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

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

我还没有尝试任何东西,因为Android开发不是我的强项。我正在寻找指导...例子,代码示例等我假设这个应该几乎是一个单行,但我的经验是,使用Android开发没有什么是它看起来那么简单

非常感谢任何帮助。

4 个答案:

答案 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中这些设置的权限。所以它很烦人,但应该足够简单。