Odpowiedź leży w źródle ... wydaje się, że właściwość żądania blokady pinów jest wbudowana w build.prop
lub default.prop
.
Spójrz na odniesienie znalezione w źródle TelephonyManager , pomiędzy liniami 735 i 755. Dla zwięzłości,
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;
}
}
Klucz jest TelephonyProperties.PROPERTY_SIM_STATE
określony w innym miejscu , między wierszami 94 i 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";
Po przeszukaniu kodu źródłowego tutaj na moim komputerze, dam ci wyobrażenie o tym, jak często ta metoda getSimState
jest wywoływana, zwróć uwagę na nazwy źródła Java, aby dowiedzieć się, w jaki sposób jest on zintegrowany z Androidem, nie tylko w warstwie telefonicznej, ale gdzie indziej.
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() {
Czy te nazwy plików dają wskazówkę, tak, na ekranie blokady ...
Teoria
Wymaga to pierwiastek w tym momencie, przez wywoływanie adb shell
i powołanie getprop
i setprop
to zrobić, to tylko część tego, powołując
adb shell getprop
odzyska odpowiednie informacje, jak pokazano poniżej
sh-4.1# getprop
[gsm.sim.state]: [READY]
Ta subtelna właściwość wydaje się być dynamicznie utrwalana w magazynie właściwości zaplecza od momentu włączenia i jest odpowiednio dostosowywana, w zależności od liczby rzeczy, usługi, nie mówiąc już o przypadkowym upuszczeniu słuchawki, która może spowodować wyrzucenie karty SIM z karty czytnik, który zmieni stan karty na „ niegotowy ” lub „ nieznany ”. ( patrz: system / core / include / cutils / properties.h oraz system / core / toolbox / [ getprop | setprop ] .c)
W tym momencie teoretycznie, wywołując setprop przed zablokowaniem ekranu, można go tymczasowo obejść, ale z drugiej strony może zostać zresetowany przez warstwę telefonii! Nie próbowałem tego! Co prowadzi do tego ...
Wniosek
Jedyny sposób ten może być wyłączony, jest skutecznie wyłączyć żądanie pin-lock na rzeczywiste karty SIM . W tym miejscu przechowywana jest „magiczna” flaga bitowa, w której warstwa RIL telefonii odczytuje ją za pośrednictwem zastrzeżonej biblioteki htc / samsung / Qualcomm, a to zapobiegałoby propagacji trwałości właściwości „PIN_REQUIRED” w górę przez warstwy Androida.
Możliwe obejście, tylko dla programistów Androida :)
Wymagałoby to włamania i ponownej kompilacji źródła.
Dla trybu samolotowego, przy wchodzeniu w ten tryb i opuszczaniu trybu samolotowego, właściwość może być podzielona na dwie części, stan gsm.sim. można pozostawić bez zmian , ale należy opracować inną właściwość, coś w tym rodzaju, stan gsm.sim.state. airplane.mode i przypisz wartość wzdłuż linii SIM_STATE_PIN_NOT_REQUIRED
i zmodyfikuj sprawdzanie trybu samolotowego, aby odczytać tę właściwość, a jeśli jest ustawiona na to, nie pokazuj okna dialogowego pinezki, w przeciwnym razie, jak zwykle, monituj.