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
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:
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?