1 votos

¿Dónde puedo encontrar la lista de redes consideradas no itinerantes?

Hace tiempo, en los tiempos de CyanogenMod, me topé con una lista de combinaciones de redes que no se consideraban roaming.

Normalmente, Android mira el MCC y el MNC de la tarjeta SIM y los compara con los de la red actual. Si no coinciden, Android considera que está en roaming. El icono de la barra de estado informará de ello, y opciones como la de desactivar los datos en itinerancia surtirán efecto.

La lista anula este comportamiento especificando combinaciones de pares MCC/MNC que no se consideran itinerantes. Por ejemplo, O2 Alemania (262-07) adquirió a su rival E-Plus (262-03) hace unos años. Al principio, las torres de telefonía seguían utilizando el MCC/MNC del operador original, pero los clientes podían hacer roaming entre ambas redes sin coste adicional. Para casos como éste, la lista habría tenido una regla como "si la tarjeta SIM tiene 262-07, considere que la red 262-03 es la red doméstica, no una red de itinerancia" (y otra para el caso opuesto de que una tarjeta E-Plus se utilice en una torre de O2).

Esta lista se encuentra en algún lugar del código fuente y no se expone a través de la configuración. Por desgracia, no sé dónde encontrarla (y si alguna vez formó parte de AOSP, o fue añadida por Cyanogenmod).

¿Alguien sabe dónde se encuentra esta lista?

1 votos

Una pregunta interesante. ¿Estás seguro de que la descición de si una red es considerada como roaming o no la hace la tarjeta SIM? Desde mi punto de vista, este sería el punto en el que esperaría una funcionalidad de este tipo.

0 votos

Al igual que Robert, prefiero esperar que sea con la configuración de la SIM - o como una "señal de retroalimentación" de la torre celular (retomando tu ejemplo: si tuvieras un 262-03 y reservaras en una torre 262-07, la torre no pondría la "bandera de roaming" en su respuesta). ¿Cómo me hago esa idea? Bueno, todavía tengo 262-03 en algunos de mis dispositivos. No hice una actualización del sistema cuando se produjo la fusión. Pude reservar en el 262-07 y no recuerdo haber visto una R. Pero viejo que soy, puede que lo haya olvidado, claro :D

0 votos

@Robert Estoy bastante seguro de que hubo algo relacionado con las redes de roaming en los registros de cambios de Cyanogenmod en algún momento. Dudo que la decisión sea tomada sólo por la tarjeta SIM: ¿cómo podría una SIM antigua (digamos, emitida alrededor del año 2000) saber sobre una fusión que ocurrió una década y media después?

4voto

vjsantojaca Puntos 95

La decisión de si una SIM está conectada a una red de itinerancia (una red de otro país, por ejemplo) la toma el marco con la información obtenida en esta red. En primer lugar, hay que saber que existen dos tipos:

  • Itinerancia nacional -> Una red del mismo país (mismo MCC) que la SIM pero que es de otro operador (diferente MNC).
  • Itinerancia internacional -> Una red de otro país (diferente MCC)

Muchos fabricantes de equipos originales (BQ, Samsung, Xiaomi...) tratan la itinerancia nacional como no itinerante porque, por ejemplo, todos los OMV utilizan la itinerancia nacional.

Por defecto, AOSP tiene una forma de añadir redes para que siempre se consideren en itinerancia (así como añadir redes que nunca se consideren en itinerancia)

Para AOSP, funciona así:


En ServiceStateTracker.java de framework/opt/telefonía :

/**
 * Do not set roaming state in case of oprators considered non-roaming.
 *
 * Can use mcc or mcc+mnc as item of
 * {@link CarrierConfigManager#KEY_NON_ROAMING_OPERATOR_STRING_ARRAY}.
 * For example, 302 or 21407. If mcc or mcc+mnc match with operator,
 * don't set roaming state.
 *
 * @param s ServiceState hold current ons
 * @return false for roaming state set
 */
private boolean isOperatorConsideredNonRoaming(ServiceState s) {
    String operatorNumeric = s.getOperatorNumeric();
    PersistableBundle config = getCarrierConfig();
    String[] numericArray = config.getStringArray(
            CarrierConfigManager.KEY_NON_ROAMING_OPERATOR_STRING_ARRAY);
    if (ArrayUtils.isEmpty(numericArray) || operatorNumeric == null) {
        return false;
    }
    for (String numeric : numericArray) {
        if (!TextUtils.isEmpty(numeric) && operatorNumeric.startsWith(numeric)) {
            return true;
        }
    }
    return false;
}

y de la misma manera:

private boolean isOperatorConsideredRoaming(ServiceState s) {
    String operatorNumeric = s.getOperatorNumeric();
    PersistableBundle config = getCarrierConfig();
    String[] numericArray = config.getStringArray(
            CarrierConfigManager.KEY_ROAMING_OPERATOR_STRING_ARRAY);
    if (ArrayUtils.isEmpty(numericArray) || operatorNumeric == null) {
        return false;
    }
    for (String numeric : numericArray) {
        if (!TextUtils.isEmpty(numeric) && operatorNumeric.startsWith(numeric)) {
            return true;
        }
    }
    return false;
}

Si buscamos información sobre KEY_ROAMING_OPERATOR_STRING_ARRAY y KEY_NON_ROAMING_OPERATOR_STRING_ARRAY en Desarrolladores de Android encontramos que enter image description here

Así que podrías añadir en carrier_config_21407 (Movistar España) una lista de roaming y no roaming:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<carrier_config_list>
  <carrier_config>
    <string-array name="gsm_nonroaming_networks_string_array" num="1">
      <item value="26804" /> //for example, LycaMobile Portugal
    </string-array>
  </carrier_config>
</carrier_config_list>

Los archivos de configuración de operador se encuentran en plataforma/paquetes/apps/CarrierConfig . Hay dos formatos posibles:

0 votos

Gracias, esto es exactamente lo que estaba buscando. ¿Por casualidad sabes algo sobre las implicaciones de añadir una red a las listas de "no itinerancia"? Ver Android.stackexchange.com/questions/231290/

0 votos

Déjame comprobarlo @user149408

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X