パート1
Qualcommプラットフォームのデュアルカードネットワークモードでは、通常、スロット1は4、3、2Gネットワークをサポートし、スロット2は通常、デフォルトで固定として記述されます。以前のandroid L以下では、msm8909およびmsm8916プラットフォームの基本設定は次のとおりです。 GSMのみ。要件はmsm8996のandroidMであるため、指定されたプラットフォーム分析の下でセットアッププロセスを実行する可能性があります。
ネットワーク設定アプリ(NetworkSetting)インターフェイスからポジショニングを開始します
。Package / service / Telephonyの下のMobileNetworkSettings.javaでネットワークモードを設定するためのメニューはListPreferenceprivate
ListPreference mButtonPreferredNetworkModeです。Preferenceを
クリックすると、ネットワークモードに対応する配列に対応します。 Androidネイティブの意志すべてのネットワークモードが表示されます。これはデバッグ段階で問題を見つけるのに適していますが、これは市場のモデルの優れたインターフェイスの相互作用と一致していません。
ユーザーは4/3 / 2Gに提示される必要があります。上記のネットワークモードメニューを選択し、
setScreenState()を選択します。このメソッドで、オペレーターからmccmncを取得し、対応するネットワークモードメニューをそれぞれカスタマイズします。
先判断一下sim卡的状态
int simState = TelephonyManager.getDefault().getSimState(mPhone.getPhoneId());
getPreferenceScreen().setEnabled(simState != TelephonyManager.SIM_STATE_ABSENT);
以下以国内电信网络模式为例,
setEntries()设置网络模式字符串,setEntryValues设置网络模式对应的数值
if((mccmnc.equals("46003")||mccmnc.equals("46005")||mccmnc.equals("46011"))) {
mButtonPreferredNetworkMode.setEntries(
R.array.preferred_network_mode_choices_FQ1_CT);
mButtonPreferredNetworkMode.setEntryValues(
R.array.preferred_network_mode_values_FQ1_CT);
if(subController.getDefaultDataSubId()==subId) {
//判断当前的subId是否为走数据的Sub,通常情况下,只让终端用户手动选择数据卡的网络模式
if ((getPreferredNetworkModeForSubId()!= 22)) {
if (getPreferredNetworkModeForSubId()== 4) {
setPreferredNetworkMode(4);
}else
setPreferredNetworkMode(22);
}
} else if(subController.getDefaultDataSubId()!=subId){
if((prefSet != null)) {
//非数据卡,直接移除网络模式设置preference
prefSet.removePreference(mButtonPreferredNetworkMode);
}
}
さらに、Qualcomm andriod Mは、PhoneFeatureアプリのカードスロット2のネットワークモードを直接修正しました。より正確には、Mの前に、カードスロット2はデフォルトで次の位置でGSMに設定されていました。
vendor\qcom\proprietary\qrdplus\Extension\apps\PhoneFeatures\src\com\qualcomm\qti\phonefeature\PrefNetworkRequest.java
public PrefNetworkRequest(Context context, int slot, int networkMode, Message callback) {
super(sSyncQueue);
mContext = context;
mCallback = callback;
commands = new ArrayList<PrefNetworkSetCommand>();
//屏蔽下面的代码,移除固定卡槽2的网络模式设置
/*if (networkMode != Phone.NT_MODE_GSM_ONLY) {
for (int index = 0; index < Constants.PHONE_COUNT; index++) {
if (index != slot)
commands.add(new PrefNetworkSetCommand(index, Phone.NT_MODE_GSM_ONLY));
}
}*/
if (slot >= 0 && slot < Constants.PHONE_COUNT) {
commands.add(new PrefNetworkSetCommand(slot, networkMode));
}
}
android Nの後、デフォルトのネットワークモードに小さな変更があります
frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java
for (int phoneId = 0; phoneId < phoneCount; phoneId++) {
mode = TelephonyManager.getTelephonyProperty(phoneId,
"ro.telephony.default_network",
Integer.toString(RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA)
if (phoneId == 0) {
val = mode;
} else {
val = val + "," + mode;
}
}
パート2
要約すると、パート1で説明する内容は、主に2つのことで行われ
ます。1。さまざまなオペレーター向けに、複雑さを簡素化し、ネットワークモードメニューを最適化します
。2。カードスロット2をネットワークモードに設定できないという制限を解除します。
私たちの究極の目標間違いなくネットワークモードは直接設定できます。ホットスワップをサポートする携帯電話デバイスとして、シムのステータスを検出した後、シムのステータスを見つけ、対応するネットワークモードを設定して異なることを確認する必要がありますsimカードはネットワークと正確に一致することができます。
次に、モデム側のNV10を見てみましょう。これはネットワークモードNVです。QXDMを介してこのNVを読み取ると、すべてのサブIDの現在のネットワークモードを取得できます。レイヤーはネットワークモードを設定しますが、これは実際にはNV10の変更です。さらに、VoLteの人気は以前はそれほど高くありませんでした。CDMAはハードウェアで単一チャネルのみをサポートするという前提の下で、テレコムカードのカードスロットを一致させる必要があります。時間にネットワークへ、そうでなければ次の状態が表示されます:
1テレコムカードは4Gネットワークに登録されていない、何のCDMAネットワークモードがないため、インターフェイスが表示され、信号グリッドを空テレコムのカードスロットに割り当てられていますカード
。2。テレコムカードは4Gネットワークに登録されています。コールが発信されると、テレコムコールはCDMAにフォールバックする必要があり、一致するネットワークモードがないため、コールの失敗に直接つながります。
カードの挿入と取り外しのたびに、無線ログからsimカード検出関連のクラス
frameworks \ opt \ telephony \ src \ java \ com \ android \ internal \ telephony \ SubscriptionInfoUpdater.javaを
見つけます。mccmncを使用して異なる演算子を区別しないでください。。、
メソッド
private void handleSimLoaded(int slotId){ に焦点を当てて、SIMカードの読み込みのハンドル処理と2つのカードスロットのネットワークモードの分布を判断するのが最善です。これは、2つのカードスロットの固定判断処理です。 slotId可変パラメーター、特にテレコムカード
int SubId = sirInfo.getSubscriptionId();
int SlotId = mSubscriptionManager.getSlotId(SubId);
int nwmode = RILConstants.PREFERRED_NETWORK_MODE;
try {
nwmode = android.provider.Settings.Global.getInt(
mPhone[SlotId].getContext().getContentResolver(),
Settings.Global.PREFERRED_NETWORK_MODE + SubId);
} catch (SettingNotFoundException snfe) {
}
try {
nwmode = TelephonyManager.getIntAtIndex(
mContext.getContentResolver(),
Settings.Global.PREFERRED_NETWORK_MODE, slotId);
} catch (SettingNotFoundException retrySnfe) {
Rlog.e(LOG_TAG, "Settings Exception Reading Value At Index for"+
" Settings.Global.PREFERRED_NETWORK_MODE");
}
}
}
上記はデフォルトネットワークモードを示しています。以下では、例としてスロット1のテレコミュニケーションカードとスロット2のモバイルカードを使用します
。slotIdネットワークモードの設定isCTCardは、現在のiccidがテレコミュニケーションカードのiccidであるかどうかを判別します。
if(isCTCard(0)&&(!isCTCard(1))) {
logd("nw ******sim1 is CT card******");
if (slotId == 1) {
if (nwmode == 16) {
mPhone[1].setPreferredNetworkType(16, null);
Settings.Global.putInt(mPhone[1].getContext().getContentResolver(),
Settings.Global.PREFERRED_NETWORK_MODE + SubId,
16);
logd(" nw "+" 111 CMCC card 3G mode, only sim1 is CT card 3G mode nwmode = "+ nwmode);
} if (nwmode == 3) {
mPhone[1].setPreferredNetworkType(3, null);
Settings.Global.putInt(mPhone[1].getContext().getContentResolver(),
Settings.Global.PREFERRED_NETWORK_MODE + SubId,
3);
logd(" nw "+" 111 CU card 3G mode, only sim1 is CT card 3G mode nwmode = "+ nwmode);
} if (nwmode == 20) {
mPhone[1].setPreferredNetworkType(20, null);
Settings.Global.putInt(mPhone[1].getContext().getContentResolver(),
Settings.Global.PREFERRED_NETWORK_MODE + SubId,
20);
logd(" nw "+" 111 if equals 20 set 20");
} if (nwmode == 1) {
mPhone[1].setPreferredNetworkType(1, null);
Settings.Global.putInt(mPhone[1].getContext().getContentResolver(),
Settings.Global.PREFERRED_NETWORK_MODE + SubId,
1);
logd(" nw "+" 111 if equals 1 set 1");
}
else if ((nwmode != 20)&&(nwmode != 16)&&(nwmode != 3)&&(nwmode != 1)) {
mPhone[1].setPreferredNetworkType(20, null);
Settings.Global.putInt(mPhone[1].getContext().getContentResolver(),
Settings.Global.PREFERRED_NETWORK_MODE + SubId,
20);
logd(" dhflogsw "+" 111 normal mode only sim1 is CT card nwmode = "+ nwmode);
}
}
if (slotId == 0) {
if (nwmode == 4) {
mPhone[0].setPreferredNetworkType(4, null);
Settings.Global.putInt(mPhone[0].getContext().getContentResolver(),
Settings.Global.PREFERRED_NETWORK_MODE + SubId,
4);
logd(" nw "+" 111 only sim1 is CT card 3G mode ");
} else {
mPhone[0].setPreferredNetworkType(22, null);
Settings.Global.putInt(mPhone[0].getContext().getContentResolver(),
Settings.Global.PREFERRED_NETWORK_MODE + SubId,
22);
logd(" nw "+" 111 only sim1 is CT card LTE mode ");
}
}
SIMカードの検出について
電話が再起動するか、SIMカードのステータス変更を検出すると、RILはSIMカード情報のクエリを開始し、読み取った情報をデータベースに書き込んで、subscriptionManagerに保存します。
このセクションはFamilyYuanのブログ、リンクhttps:を参照しています。 //blog.csdn.net / myfriend0 / article / details / 79364548ありがとうございます。
また、コンテンツのこの部分は2、3年前に変更されたものです。最近、書き留めて、整理してください。間違った場所があれば訂正してください。