クアルコムプラットフォームのデュアルカードスロットネットワークモードは、すべての国内事業者をサポートします

パート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年前に変更されたものです。最近、書き留めて、整理してください。間違った場所があれば訂正してください。

おすすめ

転載: blog.csdn.net/jeephao/article/details/103394733