La risposta sta nella fonte ... sembra che la proprietà per richiedere il pin-lock sia integrata in build.prop
o default.prop
.
Dai un'occhiata al riferimento trovato nella fonte di TelephonyManager , tra le righe 735 e 755. Per brevità,
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 chiave è quella TelephonyProperties.PROPERTY_SIM_STATE
menzionata altrove , tra le righe 94 e 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";
Dopo aver cercato attraverso il codice sorgente qui sulla mia macchina, ti darò l'idea di quanto spesso getSimState
viene chiamato questo metodo , notando i nomi del sorgente Java per capire come è integrato in Android, non solo nel livello di telefonia ma altrove.
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() {
Questi nomi di file danno un indizio, sì, nella schermata di blocco ...
Teoria
Ciò richiede root a questo punto, invocando adb shell
e chiamando getprop
e setprop
per fare ciò, l'unica parte è questa, invocando
adb shell getprop
otterrà le informazioni pertinenti come mostrato di seguito
sh-4.1# getprop
[gsm.sim.state]: [READY]
Questa proprietà sottile sembra essere persistentemente dinamicamente in un negozio di proprietà di supporto, dal momento dell'accensione e viene regolata di conseguenza, in base al numero di cose, al servizio e per non parlare di far cadere accidentalmente il ricevitore che potrebbe far cadere la sim-card da il suo lettore che cambierebbe lo stato della carta in " non pronto " o " sconosciuto ". ( ref: system / core / include / cutils / properties.h e system / core / toolbox / [ getprop | setprop ] .c)
Ora a questo punto, teoricamente, invocando setprop prima di bloccare lo schermo, potrebbe essere aggirato temporaneamente, ma poi potrebbe essere ripristinato dallo strato di telefonia! Non ci ho provato! Il che sta portando a questo ...
Conclusione
L' unico modo per disattivarlo è disabilitare in modo efficace la richiesta di blocco dei pin sulla scheda SIM effettiva . È qui che il bit-flag "magico" è memorizzato su quello, in cui il livello RIL della telefonia lo legge attraverso la libreria proprietaria htc / samsung / qualcomm, e ciò impedirebbe la proprietà del persistere della proprietà "PIN_REQUIRED" fino a i livelli di Android.
Una possibile soluzione alternativa, solo per sviluppatori Android :)
Ciò richiederebbe l'hacking e la ricompilazione della fonte.
Per la modalità aereo, quando si entra in quella modalità e si esce dalla modalità aereo, la proprietà potrebbe essere suddivisa, in due, gsm.sim.state può essere lasciato così com'è, ma escogitare un'altra proprietà, qualcosa del genere, gsm.sim.state. airplane.mode e assegnare un valore lungo le linee di SIM_STATE_PIN_NOT_REQUIRED
, e modificare il controllo della modalità aereo, per leggere quella proprietà e, se impostato su quello, non mostrare la finestra di dialogo pin, altrimenti come al solito, lo richiede.