Как стать автором
Обновить

Мое первое полезное приложение

Предыстория


Доброго времени суток, читатель.
Начну непосредственно с проблемы, с которой я столкнулся буквально вчера.
Имею аппарат LG P500 под управлением Android уже больше года. Через год после покупки надоела стандартная заводская прошивка — прошил сборку MIUI для своей модели. Поигрался. Настроил. Накачал приложений. Настроил синхронизации контактов, почты и т.д… и решил поменять тему.
Вот тут меня ждал кот в мешке. Установив тему и полистав меню, я отложил телефон. Экран заблокировался как и положено. Все бы ничего, но в стандартных темах MIUI локскрин рассчитан на другое разрешение… слайдер разблокировки был вне экрана.
Здесь должен был быть скриншот с моего телефона, но оказалось, что его нет.
Поэтому возьму готовый скриншот похожего локскрина и отмечу на нем свою проблему схематично

image

Перезагрузка не помогала, т.к. телефон загружался в локскрин.
Суть проблемы многим покажется банальной, как и ее решение, но все же я решил написать.
Выхода было два:
  • так называемый Hard reset (полный сброс настроек)
  • применить небольшое «колдунство» и разблокировать программно

Первый вариант меня бы устроил, если бы не лень ночью настраивать телефон «с ноля»…
Остановим свой выбор на втором способе.


Начало


Начну с того, что при установке был прошит custom-recovery и включен я забыл выключить режим отладки по USB, что сыграло главную роль.

Гугл отвечал мне почти одинаковыми постами на большом количестве ресурсов, а именно:

  1. adb event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0
    
    не работал с ADB моей версии, разбираться особо не стал, т.к. команда event и ADB дружить отказались
  2. adb shell input keyevent 82
    
    из той же оперы. Посылаем программно нажатие кнопки «Домой». Я ее и на самом устройстве нажимать могу. Не подходит. В этот способ я как-то поверил, но как ни старался — ни одна комбинация кнопок не разблокировала экран. Брутфорсить сим-салябим…
  3. $ ./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
    
    Это так же не сработало… хоть и натолкнуло меня на мысль, что надо будет расковырять БД настроек под свои нужды
  4. 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 и порадовался, что все настроили заботливые люди из корпорации добра. Качай — запускай — ваяй. А раньше я по несколько часов качал то одно, то другое, потом, скрещивая и занимаясь непонятно какой инженерией, запускал «Затмение». Но это уже другая история из прошлого.
Итак, вернемся к Эклипсу.

Пишем


Создаем новый проект:
image

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

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

Открываем и вставляем нужный кусок кода:
    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);
    /* ^^^^^^^блок нужен для поднятия приложения если включена блокировка*/
}

Автопроверка синтаксиса начинает ругаться. В пару кликов добавляем две строки импорта.

В итоге должно получиться пимерно так:
image

Запускаем при подключенном аппарате и наблюдаем как всплывает наше «Hello world!». Жмем кнопку «Назад» и попадаем на рабочий стол! Что и требовалось.

Для удобства приведу способ запуска приложения через ADB:
adbe shell am start -n <b>ru.z1zi.unlock/.MainActivity</b>


Эпилог


В итоге за полтора-два часа было написано мое первое приложение для телефона… такое банальное, но пригодится для последующих наработок. Возможно приложение вырастет в некий инструмент, но время покажет.
А в свое приложение я добавил картинку на задний план и изменил надпись. Картинка взята не просто так, а с подтекстом, ведь, взявшись впервые за дело, можно много чего начудить не только с локскрином.

Все исходники на «диск корпорации добра».
Скрин, как есть сейчас:
image
На этом, наверное, и пора заканчивать. Цель достигнута путем маленького «колдунства», а не брутального «ХардРесета».

P/S: скринлоков бояться — андроид не шить. Удачи в кастомизациях и надеюсь кому-то помогу хоть немного.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.