La respuesta se encuentra en la fuente ... parece ser que la propiedad para solicitar el bloqueo de clavija está integrada en build.prop
o default.prop
.
Eche un vistazo a la referencia que se encuentra en la fuente de TelephonyManager , 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 la TelephonyProperties.PROPERTY_SIM_STATE
que se menciona en otra parte , 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 a través del código fuente aquí en mi máquina, le daré la idea de la frecuencia con la que getSimState
se llama a este método , observe los nombres de la fuente de Java para saber cómo se integra en Android, no solo en la capa de telefonía sino en otra parte.
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 archivo dan una pista, sí, en la pantalla de bloqueo ...
Teoría
Esto requiere root en este punto, invocando adb shell
y llamando getprop
y setprop
para hacer esto, la única parte es esta, invocando
adb shell getprop
recuperará la información pertinente como se muestra a continuación
sh-4.1# getprop
[gsm.sim.state]: [READY]
Esta propiedad sutil parece persistir dinámicamente en una tienda de propiedades de respaldo, desde el momento del encendido y se ajusta en consecuencia, en función de la cantidad de cosas, el servicio, y sin mencionar la caída accidental del teléfono que puede sacar la tarjeta SIM de su lector que cambiaría el estado de la tarjeta a " no preparado " o " desconocido ". ( ref: system / core / include / cutils / properties.h y system / core / toolbox / [ getprop | setprop ] .c)
Ahora, en este punto, teóricamente, al invocar setprop antes de bloquear la pantalla, se puede evitar temporalmente, pero, de nuevo, ¡la capa de telefonía podría restablecerla! No he probado eso! Lo que lleva a esto ...
Conclusión
La única forma en que esto se puede desactivar es deshabilitar efectivamente la solicitud de bloqueo de pin en la tarjeta SIM real . Ahí es donde se almacena el indicador de bits "mágico", en el que la capa RIL de la telefonía lo lee a través de la biblioteca patentada de 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, solo para desarrolladores de Android :)
Esto requeriría piratear y recompilar la fuente.
Para el modo avión, al ingresar a ese modo y salir del modo avión, la propiedad podría dividirse en dos, gsm.sim.state puede dejarse como está, pero idear otra propiedad, algo como esto, gsm.sim.state. avión.mode y asigne un valor a lo largo de las líneas de SIM_STATE_PIN_NOT_REQUIRED
, y modifique la verificación del modo avión, para leer esa propiedad y, si se establece en eso, no muestre el cuadro de diálogo de pin, de lo contrario, como siempre lo hace, solicítelo.