2011-12-22 118 views
5

这是三星Galaxy Nexus的Verizon LTE版本。Android 4.0 4G切换

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

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

任何帮助将不胜感激。

+0

据我所知,普通的Android SDK应用程序无法改变这一点。 – CommonsWare 2011-12-22 17:01:07

+0

啊,很有意思。我希望情况并非如此。现在研究。我听说HTC手机存在一个小部件,这让我相信它可以完成。 – 2011-12-22 17:13:10

+1

如果有问题的应用程序小部件附带HTC手机,那不是普通的Android SDK应用程序。 – CommonsWare 2011-12-22 17:15:00

回答

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"; 

您可以在此使用反射,或只是本地化不断到您的项目。问题在于您无法更改此设置的值(与所有安全设置一样),您只能阅读它。前面提到的值并不是唯一可能的值,实际上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应用程序。

2

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

我发现改变Settings.secure。*以root权限如图所示下面的方式。

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()+"/files/sqlite3” 里的sqlite3放在提前。

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

+0

你有没有得到这个工作?看起来很有希望 – BriCo84 2013-01-31 12:56:18