При включении телефона по умолчанию предлагается ввести PIN-код SIM-карты, что является хорошей мерой безопасности, чтобы не допустить, чтобы «незнакомцы» нанесли вам расходы. Теперь то же самое при возврате из авиарежима: нужно снова вводить SIM-PIN. Что делает некоторые энергосберегающие устройства бесполезными: если приложение, например, переходит в режим полета при потере сигнала (см. Что такое режим ожидания сотовой связи и как я могу предотвратить его потребление батареи? ), оно не сможет вернуться к нормальной работе без вмешательства пользователя. .
Я ищу способ выборочно отключить это: активировать запрос PIN-кода при включении устройства, но не запрашивать PIN-код SIM-карты при выходе из режима полета.
Пожалуйста, не путайте это с "keyguard": я не спрашиваю о блокировке экрана (PIN/шаблон/пароль). Здесь я знаю свой путь, так как есть API для использования приложениями (так что я могу, например, временно отключить это с помощью Tasker ).
Я знаю, что это работает с устройствами Samsung, но я предпочитаю независимое от устройства решение, которое работает для всех производителей.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ
ВРЕМЕННОЕ РЕШЕНИЕ
Я нашел обходной путь для проблемы, который прекрасно работает на Samsung Galaxy S2 с установленным Cyanogenmod 10.2 и Dorimanx Kernel 9.41. Необходимые шаги заключаются в следующем:
Убедитесь, что ваше устройство рутировано.
Загрузите и установите установщик Xposed Framework .
Когда Xposed попросит root где-нибудь в ближайшем будущем, предоставьте его .
Откройте приложение и нажмите Framework
-Tab.
Щелкните Install/Update
.
Перезагрузка .
Загрузите и установите Jelly Bean 4.x Помощник по режиму полета .
Откройте Xposed Framework Installer
-App еще раз и выберите Modules
.
Отметьте (установить активным) Jelly Bean 4.x Airplane Mode Helper
.
Перезагрузка .
Открыть Jelly Bean 4.x Airplane Mode Helper
.
Отметьте (установить активным) Enabled .
Перезагрузка .
Вот и все! Режим полета должен снова работать, как и в предыдущих версиях Android, и больше не запрашивает PIN-код SIM-карты при выключении. Тем не менее, это все еще происходит при запуске, что обеспечивает безопасность вашей SIM-карты. Я настроил автоматическую процедуру экономии заряда батареи с помощью профилей местоположения ламы , аналогичную описанной здесь (спасибо, Иззи), и она работает безупречно.
Удачи, ребята!
Ответ кроется в источнике... кажется, что свойство запрашивать пин-блокировку встроено в build.prop
or 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 перед блокировкой экрана, его можно временно обойти, но опять же, это может быть сброшено уровнем телефонии! Такого не пробовал! Что ведет к этому...
Единственный способ отключить это — эффективно отключить запрос PIN-кода на фактической сим-карте . Именно здесь хранится «магический» битовый флаг, в котором уровень RIL телефонии считывает его через проприетарную библиотеку htc/samsung/qualcomm, и это предотвратит распространение сохранения свойства «PIN_REQUIRED» до слои Android.
Это потребует взлома и перекомпиляции исходного кода. Для режима полета при входе в этот режим и выходе из режима полета свойство можно разделить на два, gsm.sim.state можно оставить как есть, но придумать другое свойство, что-то вроде этого, gsm.sim.state. plane.mode и присвойте значение в соответствии со строками SIM_STATE_PIN_NOT_REQUIRED
и измените проверку режима полета, чтобы прочитать это свойство и, если установлено, не отображать диалоговое окно булавки, в противном случае, как обычно, запрашивать его.
Я не уверен, что вам нужно делать то, что вы пытаетесь сделать.
Вместо этого вы можете:
Tasker
задачи для включения/выключения всего, что Airplane
делает включение/отключение режима.Airplane
режим. Используйте свои Tasker
задачи.Возможно, вам придется посмотреть, включены ли какие-либо приложения для автоматического включения аппаратного радио. Посмотрите, пытается ли приложение выполнить фоновую синхронизацию или что-то еще, они могут попытаться включить отключенные радиостанции. Если это так, отключите возможность этого приложения автоматически включать, например, WiFi. Я говорю это, потому что Airplane
режим определенно останавливал неожиданные подключения к WiFi раньше, но не больше, если вы попробуете этот ответ.
Вы также можете настроить, Tasker
чтобы всегда переходить в Airplane
режим при выключении. Таким образом, вы увидите блокировку PIN-кода во время загрузки.
Иззи