Предыстория
Доброго времени суток, читатель.
Начну непосредственно с проблемы, с которой я столкнулся буквально вчера.
Имею аппарат LG P500 под управлением Android уже больше года. Через год после покупки надоела стандартная заводская прошивка — прошил сборку MIUI для своей модели. Поигрался. Настроил. Накачал приложений. Настроил синхронизации контактов, почты и т.д… и решил поменять тему.
Вот тут меня ждал кот в мешке. Установив тему и полистав меню, я отложил телефон. Экран заблокировался как и положено. Все бы ничего, но в стандартных темах MIUI локскрин рассчитан на другое разрешение… слайдер разблокировки был вне экрана.
Здесь должен был быть скриншот с моего телефона, но оказалось, что его нет.
Поэтому возьму готовый скриншот похожего локскрина и отмечу на нем свою проблему схематично
Перезагрузка не помогала, т.к. телефон загружался в локскрин.
Суть проблемы многим покажется банальной, как и ее решение, но все же я решил написать.
Выхода было два:
- так называемый Hard reset (полный сброс настроек)
- применить небольшое «колдунство» и разблокировать программно
Первый вариант меня бы устроил, если бы не лень ночью настраивать телефон «с ноля»…
Остановим свой выбор на втором способе.
Начало
Начну с того, что при установке был прошит custom-recovery и
Гугл отвечал мне почти одинаковыми постами на большом количестве ресурсов, а именно:
не работал с ADB моей версии, разбираться особо не стал, т.к. команда event и ADB дружить отказалисьadb event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0
из той же оперы. Посылаем программно нажатие кнопки «Домой». Я ее и на самом устройстве нажимать могу. Не подходит. В этот способ я как-то поверил, но как ни старался — ни одна комбинация кнопок не разблокировала экран. Брутфорсить сим-салябим…adb shell input keyevent 82
Это так же не сработало… хоть и натолкнуло меня на мысль, что надо будет расковырять БД настроек под свои нужды$ ./adb -d shell # cd data/data # sqlite3 ./com.android.providers.settings/databases/settings.db SQLite version 3.7.2 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> update system set value=1 where name='lockscreen_disabled'; sqlite> .exit # reboot
Этот метод советовал некий Абдула на англоязычном ресурсе. Абдула не «поджег», как я не кричал «Абдула! Поджигай». Опять мимо.adb shell cd /data/data/com.android.providers.settings/databases sqlite3 settings.db update system set value=0 where name='lock_pattern_autolock'; update system set value=0 where name='lockscreen.lockedoutpermanently'; .quit
Все эти способы по каким-то причинам мне не подошли. Ищем дальше. Гугл в помощь. Русскоязычные ресурсы, направленные на обзоры смартфонов и их всяческим аспектам, так же остались в стороне со своим «хард-ресетом».
Завязка
Через час поисков мне попался следующий кусок кода:
private Window wind;
@Override
protected void onResume() {
super.onResume();
/******блок нужен для поднятия приложения если включена блокировка*********/
wind = this.getWindow();
wind.addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);
wind.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);
wind.addFlags(LayoutParams.FLAG_TURN_SCREEN_ON);
/* ^^^^^^^блок нужен для поднятия приложения если включена блокировка*/
}
Имея доступ по ADB, мне оставалось запустить данный код на телефоне. Как это сделать я представлял плохо, но Hard Reset меня устраивал чуть меньше, чем никак.
Запустил Eclipse. Отмечу, что недавно (с месяц назад) устанавливал SDK и порадовался, что все настроили заботливые люди из корпорации добра. Качай — запускай — ваяй. А раньше я по несколько часов качал то одно, то другое, потом, скрещивая и занимаясь непонятно какой инженерией, запускал «Затмение». Но это уже другая история из прошлого.
Итак, вернемся к Эклипсу.
Пишем
Создаем новый проект:

Заполняем необходимые поля и выбираем нужную версию:

Затем, можно внести и другие правки в проект, но можно нажать 5 раз Next|Далее и 1 раз Finish|Готово, приступить к процессу «нанокопипаста» (программирования здесь очень мало).
Раскрываем дерево и находим в разделе src исходник MainActivity.java

Открываем и вставляем нужный кусок кода:
private Window wind;
@Override
protected void onResume() {
super.onResume();
/******блок нужен для поднятия приложения если включена блокировка*********/
wind = this.getWindow();
wind.addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);
wind.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);
wind.addFlags(LayoutParams.FLAG_TURN_SCREEN_ON);
/* ^^^^^^^блок нужен для поднятия приложения если включена блокировка*/
}
Автопроверка синтаксиса начинает ругаться. В пару кликов добавляем две строки импорта.
В итоге должно получиться пимерно так:

Запускаем при подключенном аппарате и наблюдаем как всплывает наше «Hello world!». Жмем кнопку «Назад» и попадаем на рабочий стол! Что и требовалось.
Для удобства приведу способ запуска приложения через ADB:
adbe shell am start -n <b>ru.z1zi.unlock/.MainActivity</b>
Эпилог
В итоге за полтора-два часа было написано мое первое приложение для телефона… такое банальное, но пригодится для последующих наработок. Возможно приложение вырастет в некий инструмент, но время покажет.
А в свое приложение я добавил картинку на задний план и изменил надпись. Картинка взята не просто так, а с подтекстом, ведь, взявшись впервые за дело, можно много чего начудить не только с локскрином.
Все исходники на «диск корпорации добра».
Скрин, как есть сейчас:

На этом, наверное, и пора заканчивать. Цель достигнута путем маленького «колдунства», а не брутального «ХардРесета».
P/S: скринлоков бояться — андроид не шить. Удачи в кастомизациях и надеюсь кому-то помогу хоть немного.