La décision de savoir si une carte SIM est connectée à un réseau d'itinérance (un réseau d'un autre pays, par exemple) est prise par le framework avec les informations obtenues sur ce réseau. Tout d'abord, nous devons savoir qu'il y a deux types :
- Itinérance nationale -> Un réseau du même pays (même MCC) que la SIM mais qui est d'un autre opérateur (MNC différent).
- Itinérance internationale -> Un réseau d'un autre pays (MCC différent)
Beaucoup d'OEM (BQ, Samsung, Xiaomi...) considèrent l'itinérance nationale comme n'étant pas de l'itinérance parce que, par exemple, tous les MVNO utilisent l'itinérance nationale.
Par défaut, AOSP a une manière d'ajouter des réseaux pour qu'ils soient toujours considérés en itinérance (ainsi que d'ajouter des réseaux qui ne seront jamais considérés en itinérance)
Pour AOSP, cela fonctionne comme suit :
Dans ServiceStateTracker.java de framework/opt/telephony:
/**
* Ne pas définir l'état d'itinérance en cas d'opérateurs considérés comme non itinérants.
*
* Peut utiliser mcc ou mcc+mnc comme élément de
* {@link CarrierConfigManager#KEY_NON_ROAMING_OPERATOR_STRING_ARRAY}.
* Par exemple, 302 ou 21407. Si mcc ou mcc+mnc correspondent à l'opérateur,
* ne pas définir l'état d'itinérance.
*
* @param s ServiceState conserve les ons actuels
* @return false pour définir l'état en itinérance
*/
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;
}
et de la même manière :
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 nous recherchons des informations sur KEY_ROAMING_OPERATOR_STRING_ARRAY et KEY_NON_ROAMING_OPERATOR_STRING_ARRAY dans Android Developers nous trouvons que ![entrer une description de l'image ici]()
Vous pourriez donc ajouter dans le carrier_config_21407 (Movistar Espagne) une liste de réseaux en itinérance et non en itinérance :
//par exemple, LycaMobile Portugal
Les fichiers de configuration du fournisseur sont situés dans platform/packages/apps/CarrierConfig. Il existe deux formats possibles :
1 votes
Une question intéressante. Êtes-vous sûr que la décision de considérer un réseau comme étant en itinérance ou non n'est pas prise par la carte SIM ? D'après mes connaissances, ce serait le point où je m'attendrais à une telle fonctionnalité.
0 votes
Comme Robert, je m'attends plutôt à ce que cela se fasse avec la configuration SIM - ou comme un "signal de retour" de la tour cellulaire (en reprenant votre exemple : si vous aviez un 262-03 et que vous vous connectiez à une tour 262-07, la tour ne définirait pas le "drapeau d'itinérance" dans sa réponse). Comment me suis-je fait cette idée ? Eh bien, j'ai encore des 262-03 dans certains de mes appareils. Je n'ai pas effectué de mise à jour du système lors de la fusion. Je pourrais me connecter à 262-07 et ne me rappeler d'avoir vu un R. Mais étant donné mon grand âge, j'aurais pu simplement oublier, bien sûr :D
0 votes
@Robert Je suis assez sûr qu'il y avait quelque chose lié aux réseaux d'itinérance dans les journaux de modifications de Cyanogenmod à un moment donné. Je doute que cette décision soit prise par la carte SIM seule : comment une vieille SIM (disons, émise vers 2000) pourrait-elle savoir qu'une fusion a eu lieu une décennie et demie plus tard?