La réponse se trouve dans la source... il semblerait que la propriété de demander un pin-lock soit intégrée dans l'application build.prop
o default.prop
.
Jetez un œil à la référence trouvée dans le TelephonyManager source entre les lignes 735 et 755. Par souci de concision,
public int getSimState() {
String prop = SystemProperties.get(TelephonyProperties.PROPERTY_SIM_STATE);
if ("ABSENT".equals(prop)) {
return SIM_STATE_ABSENT;
}
else if ("PIN_REQUIRED".equals(prop)) {
return SIM_STATE_PIN_REQUIRED;
}
else if ("PUK_REQUIRED".equals(prop)) {
return SIM_STATE_PUK_REQUIRED;
}
else if ("NETWORK_LOCKED".equals(prop)) {
return SIM_STATE_NETWORK_LOCKED;
}
else if ("READY".equals(prop)) {
return SIM_STATE_READY;
}
else {
return SIM_STATE_UNKNOWN;
}
}
La clé est TelephonyProperties.PROPERTY_SIM_STATE
qui est visé ailleurs entre les lignes 94 et 98.
//****** SIM Card
/**
* One of <code>"UNKNOWN"</code> <code>"ABSENT"</code> <code>"PIN_REQUIRED"</code>
* <code>"PUK_REQUIRED"</code> <code>"NETWORK_LOCKED"</code> or <code>"READY"</code>
*/
static String PROPERTY_SIM_STATE = "gsm.sim.state";
Après avoir parcouru le code source ici sur ma machine, je vous donne une idée de la fréquence à laquelle cette méthode getSimState
est appelé, remarquez les noms des sources java pour comprendre comment elles sont intégrées dans Android, pas seulement dans la couche téléphonie mais ailleurs.
services/java/com/android/server/am/BatteryStatsService.java 219: int simState = TelephonyManager.getDefault().getSimState();
telephony/java/android/telephony/TelephonyManager.java 523: public int getSimState() { 551: * @see #getSimState 562: * @see getSimState
policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java 478: public IccCard.State getSimState() {
policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java 545: final IccCard.State state = mUpdateMonitor.getSimState();
policy/src/com/android/internal/policy/impl/LockPatternKeyguardViewProperties.java 57: final IccCard.State simState = mUpdateMonitor.getSimState();
policy/src/com/android/internal/policy/impl/LockScreen.java 273: mStatus = getCurrentStatus(updateMonitor.getSimState());
policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java 173: && (mUpdateMonitor.getSimState() == IccCard.State.ABSENT); 217: final IccCard.State simState = mUpdateMonitor.getSimState(); 469: && (mUpdateMonitor.getSimState() != IccCard.State.PUK_REQUIRED)) { 512: secure = mUpdateMonitor.getSimState() == IccCard.State.PIN_REQUIRED 513: || mUpdateMonitor.getSimState() == IccCard.State.PUK_REQUIRED; 643: final IccCard.State simState = mUpdateMonitor.getSimState(); 662: final IccCard.State simState
= mUpdateMonitor.getSimState();
policy/tests/src/com/android/internal/policy/impl/LockPatternKeyguardViewTest.java 49: public IccCard.State getSimState() {
Est-ce que ces noms de fichiers donnent un indice, oui, sur l'écran de verrouillage...
Théorie
Pour cela, il faut que Root, à ce stade, en invoquant la fonction adb shell
et en appelant getprop
y setprop
pour faire cela, la seule partie est celle-ci, en invoquant
adb shell getprop
vous obtiendrez les informations pertinentes comme indiqué ci-dessous
sh-4.1# getprop
[gsm.sim.state]: [READY]
Cette propriété subtile semble être persistée dynamiquement dans un magasin de propriétés de sauvegarde, à partir du moment de la mise sous tension et est ajustée en conséquence, en fonction d'un certain nombre de choses, du service, et sans parler de la chute accidentelle du combiné qui peut faire tomber la carte SIM de son lecteur, ce qui changerait l'état de la carte en " ". pas prêt " o " inconnu ". ( réf : system/core/include/cutils/properties.h y système/core/toolbox/ [ getprop | setprop ].c)
Maintenant, à ce stade, théoriquement, en invoquant setprop avant de verrouiller l'écran, il pourrait être contourné temporairement, mais là encore, cela pourrait être réinitialisé par la couche de téléphonie ! Je n'ai pas essayé ! Ce qui nous amène à ceci...
Conclusion
El seul moyen ce qui peut être désactivé, c'est d'effectivement désactiver la demande de pin-lock sur la carte sim actuelle . C'est là que le bit-flag "magique" est stocké, dans lequel la couche RIL de la téléphonie le lit via la bibliothèque propriétaire htc/samsung/qualcomm, et cela empêcherait la propagation de la persistance de la propriété "PIN_REQUIRED" à travers les couches d'Android.
Une solution de contournement possible, pour les développeurs Android uniquement :)
Il faudrait pour cela pirater et recompiler les sources. Pour le mode avion, lorsqu'on entre dans ce mode et qu'on le quitte, la propriété pourrait être divisée en deux, gsm.sim.state peut être laissé tel quel, mais concevez une autre propriété, quelque chose comme ceci, gsm.sim.state.airplane.mode et attribuer une valeur du type SIM_STATE_PIN_NOT_REQUIRED
et modifiez la vérification du mode avion, pour lire cette propriété et, si elle est définie comme telle, ne pas afficher la boîte de dialogue de l'épingle, sinon, comme d'habitude, l'inviter.