La respuesta está en la fuente... parece ser que la propiedad para solicitar el pin-lock está construida en build.prop
o default.prop
.
Echa un vistazo a la referencia que se encuentra en el TelephonyManager fuente entre las líneas 735 y 755. Por brevedad,
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 clave es TelephonyProperties.PROPERTY_SIM_STATE
que se refiere en otro lugar entre las líneas 94 y 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";
Después de buscar en el código fuente aquí en mi máquina, te daré una idea de la frecuencia con la que este método getSimState
se llama, fíjense en los nombres de la fuente de Java para saber cómo se integra en Android, no sólo en la capa de telefonía sino en cualquier otro lugar.
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() {
¿Esos nombres de archivos dan una pista, sí, en la pantalla de la cerradura...
Teoría
Esto requiere que Root en este punto, invocando la adb shell
y llamando getprop
y setprop
para hacer esto, la única parte es esta, invocando
adb shell getprop
obtendrá la información pertinente como se muestra a continuación
sh-4.1# getprop
[gsm.sim.state]: [READY]
Esta sutil propiedad parece persistir dinámicamente en una tienda de propiedades de respaldo, desde el momento en que se enciende y se ajusta en consecuencia, basado en el número de cosas, el servicio, y por no hablar de dejar caer accidentalmente el auricular que puede dejar fuera de su lector la tarjeta sim, lo que cambiaría el estado de la tarjeta a " no está listo "o" desconocido ". ( ref: sistema/núcleo/incluir/cutillas/propiedades.h y sistema/núcleo/caja de herramientas/ [ getprop | setprop ].c)
Ahora en este punto, teóricamente, invocando setprop antes de bloquear la pantalla, podría ser evitado temporalmente, pero de nuevo, eso podría ser restablecido por la capa de telefonía! ¡No he intentado eso! Lo que está llevando a esto...
Conclusión
El La única manera esto puede ser apagado, es para efectivamente deshabilitar la solicitud de bloqueo de la tarjeta SIM real . Ahí es donde se almacena la bandera de bits "mágica", en la que la capa de RIL de la telefonía la lee a través de la biblioteca propietaria htc/samsung/qualcomm, y eso evitaría la propagación de la persistencia de la propiedad "PIN_REQUIRED" a través de las capas de Android.
Una posible solución, sólo para desarrolladores de Android :)
Esto requeriría hackear y recompilar la fuente. Para el modo de avión, al entrar en ese modo y al salir del modo de avión, la propiedad podría dividirse, en dos, gsm.sim.state puede dejarse como está, pero inventar otra propiedad, algo como esto, gsm sim modo.de.avión.estatal y asignar un valor a lo largo de las líneas de SIM_STATE_PIN_NOT_REQUIRED
y modificar la comprobación del modo de avión, para leer esa propiedad y si está configurado para ello, no mostrar el cuadro de diálogo de la clavija, de lo contrario, como suele hacerlo, lo incita.