El modo de red de ranura para tarjeta dual de la plataforma Qualcomm es compatible con todos los operadores nacionales

Parte 1

El modo de red de tarjeta dual de la plataforma Qualcomm suele ser que la ranura 1 admite redes 4, 3, 2G, y la ranura 2 generalmente se escribe como fija de forma predeterminada.En la versión anterior de Android L e inferior, la configuración básica de las plataformas msm8909 y msm8916 es Solo GSM, porque el requisito es para Android M de msm8996, por lo que probablemente pasaré por el proceso de configuración en el análisis de plataforma especificado.
Comience a posicionar desde la interfaz de la aplicación de configuración de red (NetworkSetting).
El menú para configurar el modo de red en MobileNetworkSettings.java en package / service / Telephony es ListPreference
private ListPreference mButtonPreferredNetworkMode; al
hacer clic en Preference, corresponde a la matriz correspondiente al modo de red, y Se muestran todos los modos de red nativos de Android, lo que es adecuado para encontrar problemas en la etapa de depuración, pero esto no está en línea con la buena interacción de la interfaz de los modelos en el mercado. El
usuario debe presentarse al 4/3 / 2G menú de modo de red mencionado anteriormente y seleccione
setScreenState () Bajo el método, obtenga mccmnc a través del operador para personalizar el menú de modo de red correspondiente

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

Además, Qualcomm andriod M corrigió directamente el modo de red de la ranura para tarjetas 2 en la aplicación PhoneFeature. Más exactamente, antes de M, la ranura para tarjetas 2 estaba configurada en GSM de forma predeterminada en la siguiente posición.

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

Después de Android N, el modo de red predeterminado tiene un pequeño cambio

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

En resumen, el contenido descrito en la Parte 1 se realiza principalmente en dos cosas:
1. Para diferentes operadores, simplificando el complejo, optimizando el menú del modo de red
2. Eliminando la restricción de que la ranura de la tarjeta 2 no se puede configurar en ningún modo de red.
Nuestro objetivo final es definitivamente El modo de red se puede configurar directamente, y como un dispositivo de teléfono móvil que admite intercambio en caliente, es necesario encontrar el estado del sim después de detectar el estado del sim y luego configurar el modo de red correspondiente para asegurarse de que diferentes Las tarjetas SIM pueden coincidir con precisión con la red.
Luego, una pequeña mención. Echemos un vistazo al NV10 en el lado del módem. Este es un modo de red NV. Lea este NV a través de QXDM, puede obtener el modo de red actual de todos los subIds. La capa establece el modo de red, que en realidad es una modificación de NV10. Además, la popularidad de VoLte no era tan alta antes. Bajo la premisa de CDMA, dado que CDMA solo admite un solo canal en hardware, la ranura de la tarjeta de telecomunicaciones debe coincidir con la red a tiempo; de lo contrario, aparecerá el siguiente estado:
1. La tarjeta de telecomunicaciones no está registrada en la red 4G, luego la interfaz muestra una cuadrícula de señal vacía, porque no hay un modo de red CDMA asignado a la ranura de la tarjeta de la tarjeta de telecomunicaciones.
2. La tarjeta de telecomunicaciones está registrada en la red 4G. Una vez que se realiza una llamada, la llamada de telecomunicaciones debe volver a CDMA, y no hay un modo de red coincidente, lo que conduce directamente a la falla al llamar a Be Llamada entrante

Busque los
marcos de clase relacionados con la detección de tarjetas SIM \ opt \ telephony \ src \ java \ com \ android \ internal \ telephony \ SubscriptionInfoUpdater.java a través del registro de radio de cada inserción y extracción de la tarjeta.
No utilice mccmnc para distinguir entre diferentes operadores ., Es mejor juzgar el
manejo del manejo de la carga de la tarjeta SIM y la distribución del modo de red de las dos ranuras para tarjetas, enfocándose en el método
private void handleSimLoaded (int slotId) { Aquí está el procesamiento de juicio fijo de las dos ranuras para tarjetas, con slotId Parámetros variables, especialmente tarjetas de telecomunicaciones

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

  }

Lo anterior lee el modo de red predeterminado. A continuación, se usa la tarjeta de telecomunicaciones en la ranura 1 y la tarjeta móvil en la ranura 2 como ejemplos. Configurar el modo de red
slotId isCTCard es determinar si el iccid actual es el iccid de la tarjeta de telecomunicaciones

 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 ");
                    }
                }
Acerca de la detección de tarjetas SIM

Cuando el teléfono se reinicia o detecta el cambio de estado de la tarjeta SIM, RIL iniciará una consulta para la información de la tarjeta SIM, escribirá la información leída en la base de datos y la guardará en el
Inserte la descripción de la imagen aquí
administrador de suscripciones. Esta sección se refiere al blog de FamilyYuan, enlace https: //blog.csdn.net / myfriend0 / article / details / 79364548, gracias.
Además, esta parte del contenido es algo que se ha cambiado hace dos o tres años. Recientemente, creo que es necesario escribirlo y resuelve. Si hay algún lugar incorrecto, corrígeme.

Supongo que te gusta

Origin blog.csdn.net/jeephao/article/details/103394733
Recomendado
Clasificación