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 アプリケーションでは許可されないアクセス許可が必要になります。