Відповідь лежить у джерелі ... здається, що властивість запитувати pin-lock вбудовано в build.prop
або default.prop
.
Погляньте на посилання, знайдені у джерелі TelephonyManager , між рядками 735 та 755. Для стислості,
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;
}
}
Ключ, TelephonyProperties.PROPERTY_SIM_STATE
який посилається в іншому місці , між рядками 94 та 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";
Переглянувши вихідний код тут, на моїй машині, я дам вам уявлення про те, як часто цей метод getSimState
викликається, зауважте назви джерела java, щоб зрозуміти, як його інтегрувати в Android, а не лише у шарі Telephony, але в іншому місці.
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() {
Ці імена файлів дають підказку, так, на заблокованому екрані ...
Теорія
Для цього потрібен корінь у цій точці, викликаючи adb shell
і виклику, getprop
і setprop
зробити це, єдиною частиною є це, шляхом виклику
adb shell getprop
поверне відповідну інформацію, як показано нижче
sh-4.1# getprop
[gsm.sim.state]: [READY]
Це тонке властивість, здається, динамічно зберігається в резервному магазині властивостей, починаючи з моменту вмикання, і відповідно регулюється, виходячи з кількості речей, послуг і не кажучи вже про випадкове викидання слухавки, що може вибити сім-карту з його читач, який змінив би стан картки на " не готовий " або " невідомий ". ( ref: system / core / include / cutils / properties.h та system / core / toolbox / [ getprop | setprop ] .c)
Тепер на цьому етапі теоретично, викликаючи setprop перед блокуванням екрана, його можна було тимчасово обійти, але потім знову, що може бути скинуто шаром телефонії! Не пробували цього! Що веде до цього ...
Висновок
Єдиний спосіб це може бути вимкнено, щоб ефективно відключити запит пін-блокування на реальній сім-карті . Саме тут зберігається "чарівний" біт-прапор, у якому RIL-шар телефону телефонії зчитує його через власну бібліотеку htc / samsung / qualcomm, і це перешкоджатиме розповсюдженню властивості "PIN_REQUIRED" вгору шари Android.
Можлива обробка лише для розробників Android :)
Це вимагатиме злому та перекомпіляції джерела.
У режимі літака, коли ви входите в цей режим і виходите з режиму літака, властивість можна розділити на два, gsm.sim.state можна залишити як є, але розробити іншу властивість, щось подібне, gsm.sim.state. airplane.mode та призначте значення за рядками SIM_STATE_PIN_NOT_REQUIRED
та змініть прапорець в режимі літака, щоб прочитати цю властивість, і якщо вона встановлена для цього, не показуйте діалогове вікно шпильки, інакше, як це зазвичай відбувається, запросіть його.