2011-12-22 61 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