La réponse se trouve dans la source ... il semble que la propriété de demander le verrouillage des broches soit intégrée à build.prop
ou default.prop
.
Jetez un œil à la référence trouvée dans la source TelephonyManager , 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 celle TelephonyProperties.PROPERTY_SIM_STATE
qui est référencée 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 recherché le code source ici sur ma machine, je vais vous donner une idée de la fréquence à laquelle cette méthode getSimState
est appelée, notez les noms de la source java pour savoir comment elle est intégrée dans Android, pas seulement dans la couche Téléphonie mais autre part.
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, yup, dans l'écran de verrouillage ...
Théorie
Cela nécessite root à ce stade, en adb shell
appelant et en appelant getprop
et setprop
pour ce faire, la seule partie est la suivante, en invoquant
adb shell getprop
récupérera les informations pertinentes comme indiqué ci-dessous
sh-4.1# getprop
[gsm.sim.state]: [READY]
Cette propriété subtile semble persister dynamiquement dans un magasin de propriétés de support, à partir du moment de la mise sous tension et est ajustée en conséquence, en fonction du nombre de choses, du service, et sans parler de la chute accidentelle du combiné qui peut faire tomber la carte SIM de son lecteur qui changerait l'état de la carte en " non prêt " ou " inconnu ". ( réf: system / core / include / cutils / properties.h et system / 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é ça! Ce qui mène à cela ...
Conclusion
La seule façon de désactiver cela est de désactiver efficacement la demande de verrouillage des broches sur la carte SIM réelle . C'est là que le bit-flag "magique" est stocké sur celui-ci, dans lequel la couche RIL de la téléphonie le lit via la bibliothèque propriétaire de htc / samsung / qualcomm, et cela empêcherait la propagation de la persistance de la propriété "PIN_REQUIRED" jusqu'à les couches d'Android.
Une solution de contournement possible, pour les développeurs Android uniquement :)
Cela nécessiterait le piratage et la recompilation de la source.
Pour le mode avion, lorsque vous entrez dans ce mode et quittez le mode avion, la propriété peut être divisée en deux, gsm.sim.state peut être laissé tel quel , mais créez une autre propriété, quelque chose comme ceci, gsm.sim.state. Avion.mode et attribuez une valeur dans le sens de SIM_STATE_PIN_NOT_REQUIRED
, et modifiez la vérification du mode avion, pour lire cette propriété et si elle est définie sur celle-ci, n'affichez pas la boîte de dialogue de broche, sinon comme d'habitude, invitez-la.