Le mode réseau à double emplacement pour carte Qualcomm prend en charge tous les opérateurs nationaux

Partie 1

Le mode réseau à double carte de la plate-forme Qualcomm est généralement que l'emplacement 1 prend en charge les réseaux 4, 3, 2G, et l'emplacement 2 est généralement écrit comme fixe par défaut. Dans la version précédente de l'android L et les versions antérieures, le paramètre de base des plates-formes msm8909 et msm8916 est GSM uniquement, car l'exigence est pour Android M de msm8996, donc je vais probablement passer par le processus de configuration sous l'analyse de plate-forme spécifiée.
Démarrez le positionnement à partir de l'interface de l'application des paramètres réseau (NetworkSetting).
Le menu de configuration du mode réseau dans MobileNetworkSettings.java sous package / service / Telephony est ListPreference
privé ListPreference mButtonPreferredNetworkMode; en
cliquant sur Preference correspond au tableau correspondant au mode réseau, et Android native will Tous les modes réseau sont affichés, ce qui permet de trouver des problèmes lors de la phase de débogage, mais cela n'est pas conforme à la bonne interaction d'interface des modèles sur le marché. L'
utilisateur doit être présenté au 4/3 / 2G menu du mode réseau mentionné ci-dessus et sélectionnez
setScreenState () Sous la méthode, obtenez mccmnc via l'opérateur pour personnaliser le menu du mode réseau correspondant

先判断一下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);
             }
      }

De plus, Qualcomm andriod M a directement corrigé le mode réseau de l'emplacement de carte 2 sur l'application PhoneFeature. Plus précisément, avant M, l'emplacement de carte 2 était réglé par défaut sur GSM dans la position suivante.

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));
        }
    }

Après Android N, le mode réseau par défaut a un petit changement

  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;
                }
            }
Partie 2

En résumé, le contenu décrit dans la partie 1 consiste principalement en deux choses:
1. Pour différents opérateurs, simplifier le complexe, optimiser le menu du mode réseau
2. Lever la restriction selon laquelle l'emplacement de carte 2 ne peut être réglé sur aucun mode réseau.
Notre objectif ultime est définitivement Le mode réseau peut être défini directement, et en tant que périphérique de téléphone portable prenant en charge le remplacement à chaud, il est nécessaire de trouver l'état de la carte SIM après avoir détecté l'état de la carte SIM, puis de définir le mode réseau correspondant pour s'assurer que différents Les cartes SIM peuvent correspondre avec précision au réseau.
Ensuite, une petite mention Jetons un coup d'œil à la NV10 côté modem. Il s'agit d'une NV en mode réseau. Lisez cette NV via QXDM, vous pouvez obtenir le mode réseau actuel de tous les sous-ID. couche définit le mode réseau, qui est en fait une modification de NV10. De plus, la popularité de VoLte n'était pas si élevée auparavant. Sous le principe de CDMA, étant donné que CDMA ne prend en charge qu'un seul canal dans le matériel, l'emplacement pour carte de la carte de télécommunication doit correspondre au réseau à temps, sinon l'état suivant apparaîtra:
1. La carte de télécommunication n'est pas enregistrée sur le réseau 4G, puis l'interface affiche une grille de signal vide, car il n'y a pas de mode réseau CDMA attribué à l'emplacement de carte de la carte de télécommunication.
2. la carte de télécommunication est enregistré sur le réseau 4G. une fois qu'un appel est fait, les besoins d'appels de télécommunications à se replier à CDMA, et il n'y a pas de mode réseau d'adaptation, ce qui directement conduit à l'échec d'appeler Be appelé

Localisez les
cadres de classe liés à la détection de la carte SIM \ opt \ telephony \ src \ java \ com \ android \ internal \ telephony \ SubscriptionInfoUpdater.java dans le journal radio de chaque insertion et retrait de la carte.
N'utilisez pas mccmnc pour faire la distinction entre les différents opérateurs ., Il est préférable de juger de la
gestion du chargement de la carte SIM et de la répartition en mode réseau des deux emplacements de carte, en se concentrant sur la méthode
private void handleSimLoaded (int slotId) { Voici le traitement de jugement fixe des deux emplacements de carte, avec slotId Paramètres variables, en particulier les cartes télécom

        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");
            }
        }

  }

Ce qui précède lit le mode réseau par défaut. Ce qui suit utilise la carte de télécommunications dans le logement 1 et la carte mobile dans le logement 2 comme exemples. Le réglage du mode réseau
slotId isCTCard consiste à déterminer si l'iccid actuel est l'iccid de la carte de télécommunications

 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 ");
                    }
                }
À propos de la détection de la carte SIM

Lorsque le téléphone redémarre ou détecte le changement d'état de la carte SIM, RIL lance une requête pour les informations de la carte SIM, écrit les informations de lecture dans la base de données et les enregistre dans le subscriptionManager.
Insérez la description de l'image ici
Cette section fait référence au blog de FamilyYuan, lien https: //blog.csdn.net / myfriend0 / article / details / 79364548, merci.
De plus, cette partie du contenu est quelque chose qui a été changé il y a deux ou trois ans. Récemment, je pense qu'il est nécessaire de l'écrire et S'il y a un endroit incorrect, veuillez me corriger.

Je suppose que tu aimes

Origine blog.csdn.net/jeephao/article/details/103394733
conseillé
Classement