2011-12-22 9 views
5

これは、Samsung Galaxy NexusのVerizon LTEバージョン用です。Android 4.0 4Gトグル

私は、効果的に4G機能を無効/有効にする小さなアプリを書くことが課せられています。これは手動でsettings > mobile network > network modeで行い、LTE/CDMA(4g有効)またはCDMA(3gのみ)のいずれかを選択して行うことができます。

Androidの開発が私の強い訴訟ではないので、まだ何も試していません。私は指針を探しています...例、コードサンプルなどです。私はこれをと仮定していますが、はほぼ1ライナーでなければなりませんが、Android開発ではそれほどシンプルではありません。

ご協力いただきますようお願い申し上げます。

+0

私の知る限りを、通常のAndroidのSDKアプリケーションは、これを変更することはできません。 – CommonsWare

+0

ああ、とても面白いです。私はそれが事実ではないことを願っています。今調べている。私はHTCの携帯電話のためのウィジェットが存在すると聞きました。 –

+1

問題のアプリウィジェットがHTC電話に同梱されている場合、これは通常のAndroid SDKアプリケーションではありません。 @CommonsWare、 – CommonsWare

答えて

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から隠されており、Reflectionにアクセスする必要があります。

TelephonyManagerにもう1つの非表示の方法がありますが、この定数を設定する方法は他にありません。

/** 
* 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; 
    } 
} 

私の研究から、あなたは、このようなAN作ることができなかった。これは、デバイスが「LTE/CDMA」(LTE_ON_CDMA_TRUE)または「のみCDMA」(LTE_ON_CDMA_FALSE)に設定されているかどうか、あなたが知りたい正確に何を言うだろうコマンドラインからsetpropのようなものを使用しますが、この設定を有効にするには、テレフォニープロセス全体を再起動する必要があります。

最後に、まだ興味がある場合は、com.android.phone.Settingsを参照して、システムがこのトグルをどのように処理するかを確認してください。それはむしろ精巧で、私が言及したように、通常のAndroidアプリケーションが許可されない許可が必要になります。

2

私は

...、また、WCDMA/LTE WCDMAのみの設定を変更することに興味がある私は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はsqlite3のは、事前に置かれた "/data/data/"+context.getPackageName()+"/files/sqlite3" です。

しかし、com.android.internal.telephony.Phoneを呼び出す必要があるようです。 Settings.Secure.PREFERRED_NETWORK_MODEを設定した後、setPreferredNetworkType()を切り替えます(WCDMAのみ< => WCDMA/LTE)。 私の電話機(Settings.secureも設定してください。PREFERRED_NETWORK_MODE = 2)LTEネットワークに接続...

+0

これはこれまでに実現しましたか?それは有望に見える – BriCo84

関連する問題