Ответ лежит в источнике ... кажется, что свойство запрашивать пин-блокировку встроено в 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, не только в слой телефонии, но и в другом месте.
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() {
Эти имена файлов дают подсказку, да, на экране блокировки ...
теория
Это требует root на этом этапе, вызывая adb shellи вызывая getpropи setpropдля этого, единственная часть это, вызывая
adb shell getprop вернет соответствующую информацию, как показано ниже
sh-4.1# getprop
[gsm.sim.state]: [READY]
Это тонкое свойство, по-видимому, динамически сохраняется в резервном хранилище свойств с момента включения и корректируется соответствующим образом в зависимости от количества вещей, услуги, не говоря уже о случайном падении телефона, которое может выбить сим-карту из его считыватель, который изменит состояние карты на « не готов » или « неизвестен ». ( ссылка: 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. plane.mode и присвойте значение по линиям SIM_STATE_PIN_NOT_REQUIREDи измените проверку режима самолета, чтобы прочитать это свойство и, если оно установлено, не показывать диалоговое окно булавки, в противном случае, как обычно, запрашивать его.