Ответ лежит в источнике ... кажется, что свойство запрашивать пин-блокировку встроено в 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
и измените проверку режима самолета, чтобы прочитать это свойство и, если оно установлено, не показывать диалоговое окно булавки, в противном случае, как обычно, запрашивать его.