суббота, 11 января 2014 г.

IP вебкамера WiFi из Android смартфона с разбитым тачскрином

В один прекрасный момент мой лабрадор основательно пожевал Android смартфон Мегафон Логин (он же Huawei U8180 Ideos X1) сына. Хотя у него и развитая общая тормознутость, он обладает неплохой 3.2 МП камерой сзади и поэтому было решено сделать из него беспроводную WiFi вебкамеру.

Проблема оставалась одна, точнее три - полностью неработающий тачскрин, а также выключенный wifi и отсутствие программы Google Play (выпилил, чтоб ребенок ничего лишнего не поставил).






0. Подключаем телефон к компьютеру и запускаем ADB
Нам очень крупно повезло, т.к. режим разработчика на нем был подключен. Иначе пришлось бы посвятить еще одну статью перепрошивке смартфона с этим предустановленным режимом, а может быть ничего бы и не получилось.
Но режим оказался включен, и можно было подключить смартфон к ПК, установить драйвер ADB и законнектиться через ADB шелл. Хорошая статья по подключению и работе через ADB есть на 4pda.

1. Разблокируем экран
Результат нашей бурной деятельности невозможно было увидеть, т.к. экран был заблокирован, а без тачскрина что-либо сделать было проблематично. Я попытался разблокировать смартфон командами ADB, но с сожалению ничего не получалось. Поэтому в эклипсе была написана программа:

Создаем новый пустой проект в Eclipse, в AndroidManifest прописываем строчку:

 <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>  

В основную активити добавляем три строчки:
 KeyguardManager keyguardManager = (KeyguardManager)getSystemService( Activity.KEYGUARD_SERVICE );  
 KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);  
 lock.disableKeyguard();  

Запускаем и вуаля, смартфон разблокирован!

2. Осваиваем управление через ADB
Еще полчаса ушло на освоение работой смартфона кейкодами.

Если мы хотим написать текст, пишем в консоли:
input text [текст]


Если мы хотим послать событие, пишем в консоли:
input keyevent [код события]
Их перечень:
 0 --> "KEYCODE_UNKNOWN"   
 1 --> "KEYCODE_MENU"   
 2 --> "KEYCODE_SOFT_RIGHT"   
 3 --> "KEYCODE_HOME"   
 4 --> "KEYCODE_BACK"   
 5 --> "KEYCODE_CALL"   
 6 --> "KEYCODE_ENDCALL"   
 7 --> "KEYCODE_0"   
 8 --> "KEYCODE_1"   
 9 --> "KEYCODE_2"   
 10 --> "KEYCODE_3"   
 11 --> "KEYCODE_4"   
 12 --> "KEYCODE_5"   
 13 --> "KEYCODE_6"   
 14 --> "KEYCODE_7"   
 15 --> "KEYCODE_8"   
 16 --> "KEYCODE_9"   
 17 --> "KEYCODE_STAR"   
 18 --> "KEYCODE_POUND"   
 19 --> "KEYCODE_DPAD_UP"   
 20 --> "KEYCODE_DPAD_DOWN"   
 21 --> "KEYCODE_DPAD_LEFT"   
 22 --> "KEYCODE_DPAD_RIGHT"   
 23 --> "KEYCODE_DPAD_CENTER"   
 24 --> "KEYCODE_VOLUME_UP"   
 25 --> "KEYCODE_VOLUME_DOWN"   
 26 --> "KEYCODE_POWER"   
 27 --> "KEYCODE_CAMERA"   
 28 --> "KEYCODE_CLEAR"   
 29 --> "KEYCODE_A"   
 30 --> "KEYCODE_B"   
 31 --> "KEYCODE_C"   
 32 --> "KEYCODE_D"   
 33 --> "KEYCODE_E"   
 34 --> "KEYCODE_F"   
 35 --> "KEYCODE_G"   
 36 --> "KEYCODE_H"   
 37 --> "KEYCODE_I"   
 38 --> "KEYCODE_J"   
 39 --> "KEYCODE_K"   
 40 --> "KEYCODE_L"   
 41 --> "KEYCODE_M"   
 42 --> "KEYCODE_N"   
 43 --> "KEYCODE_O"   
 44 --> "KEYCODE_P"   
 45 --> "KEYCODE_Q"   
 46 --> "KEYCODE_R"   
 47 --> "KEYCODE_S"   
 48 --> "KEYCODE_T"   
 49 --> "KEYCODE_U"   
 50 --> "KEYCODE_V"   
 51 --> "KEYCODE_W"   
 52 --> "KEYCODE_X"   
 53 --> "KEYCODE_Y"   
 54 --> "KEYCODE_Z"   
 55 --> "KEYCODE_COMMA"   
 56 --> "KEYCODE_PERIOD"   
 57 --> "KEYCODE_ALT_LEFT"   
 58 --> "KEYCODE_ALT_RIGHT"   
 59 --> "KEYCODE_SHIFT_LEFT"   
 60 --> "KEYCODE_SHIFT_RIGHT"   
 61 --> "KEYCODE_TAB"   
 62 --> "KEYCODE_SPACE"   
 63 --> "KEYCODE_SYM"   
 64 --> "KEYCODE_EXPLORER"   
 65 --> "KEYCODE_ENVELOPE"   
 66 --> "KEYCODE_ENTER"   
 67 --> "KEYCODE_DEL"   
 68 --> "KEYCODE_GRAVE"   
 69 --> "KEYCODE_MINUS"   
 70 --> "KEYCODE_EQUALS"   
 71 --> "KEYCODE_LEFT_BRACKET"   
 72 --> "KEYCODE_RIGHT_BRACKET"   
 73 --> "KEYCODE_BACKSLASH"   
 74 --> "KEYCODE_SEMICOLON"   
 75 --> "KEYCODE_APOSTROPHE"   
 76 --> "KEYCODE_SLASH"   
 77 --> "KEYCODE_AT"   
 78 --> "KEYCODE_NUM"   
 79 --> "KEYCODE_HEADSETHOOK"   
 80 --> "KEYCODE_FOCUS"   
 81 --> "KEYCODE_PLUS"   
 82 --> "KEYCODE_MENU"   
 83 --> "KEYCODE_NOTIFICATION"   
 84 --> "KEYCODE_SEARCH"   
 85 --> "TAG_LAST_KEYCODE"  

Самые полезные команды это - 66 - enter, 82 - menu, 19,20,21,22 - стрелки (помогают перемещаться по настройкам).
Освоил список, когда настраивал WiFi для подключения на работе.

3.Устанавливаем необходимое
Теперь необходимо установить программу IP Webcam. Она на Google Play. У нее очень аскетичный интерфейс в меню, который позволяет прыгать по нему командами ADB, многие программы этого не дают делать.

Через ADB программа устанавливается так:
adb install *.apk

Чтобы запустить приложение, придется провести реверс-инжиниринг и узнать в AndroidManifest.xml как называется package и первая (LAUNCHER) активити этого приложения.
Есть набор утилит APK MultiTool для разбора дистрибутива программы.
Лаунчер этого приложения, как ни странно, называется Configuration:
     <activity android:name="Configuration" android:label="@string/app_name" android:launchMode="singleTop">  
       <intent-filter>  
         <action android:name="android.intent.action.MAIN" />  
         <category android:name="android.intent.category.LAUNCHER" />  
       </intent-filter>  
     </activity>  


Команды на запуск определенного приложения неплохо описаны здесь:
http://stackoverflow.com/questions/4567904/how-to-start-an-application-using-android-adb-tools

Запускаем командой
am start -n com.package.name/com.package.name.ActivityName
в нашем случае
am start -n com.pas.webcam/com.pas.webcam.Configuration 

а дальше уже по отработанной технологии настраиваем его как нам надо.
Наверное всё