5

这适用于三星 Galaxy Nexus 的 Verizon LTE 版本。

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

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

任何帮助将不胜感激。

4

4 回答 4

5

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

    /**
     * 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”(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 应用程序不会获得的权限。

于 2012-01-02T20:30:52.330 回答
2

我也有兴趣更改设置 WCDMA-only、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 ,mySqlite是"/data/data/"+context.getPackageName()+"/files/sqlite3",这里提前放了sqlite3。

但是,似乎我们必须调用 com.android.internal.telephony.Phone。setPreferredNetworkType () 用于在设置 Settings.secure.PREFERRED_NETWORK_MODE 后进行切换(仅限 WCDMA<=>WCDMA/LTE)。我的手机(甚至设置 Settings.secure.PREFERRED_NETWORK_MODE = 2)连接到 LTE 网络...

于 2012-06-16T18:21:05.090 回答
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

于 2013-04-15T10:14:31.017 回答
-1

http://developer.android.com/reference/android/provider/Settings.System.html

除了在 Activity.java 中编写代码之外,您可能还必须请求访问 AndroidManifest.xml 中这些设置的权限。所以这很烦人,但应该足够简单。

于 2011-12-22T17:13:05.487 回答