5

これは、Samsung Galaxy Nexus の Verizon LTE バージョン用です。

私は、4G 機能を効果的に無効化/有効化する小さなアプリを作成する任務を負っています。これは、 (4g 有効) または(3g のみ)settings > mobile network > network modeのいずれかを選択して手動で行うことができます。LTE/CDMACDMA

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 から隠され、アクセスするには 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;
    }
}

私の調査によると、ルート アクセスなしでコマンド ラインなどを使用してこのようなアプリケーションを作成することはできませんでしsetpropたが、それでも、この設定を有効にするためにテレフォニー プロセス全体を再起動する必要がある場合があります。

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

于 2012-01-02T20:30:52.330 に答える
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 を導入し、mySqlite は sqlite3 を先に置いた "/data/data/"+context.getPackageName()+"/files/sqlite3" です。

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

于 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 に答える