Webkey 1.0 - böngészőből irányítani android telefont

 ( hud | 2010. május 13., csütörtök - 22:18 )

Tesztelésben kérnénk a segítségeteket. Írtunk egy programot, amivel web-en keresztül lehet Androidos telefonon gépelni, kattintani, képernyőképet készíteni, az SD kártya tartalmát böngészni, stb. Az általunk elérhető telefonokon teszteltük, de jó lenne, ha nem tartalmazna hibákat, mikor kitesszük a Marketre.

ROOTOLT! telefon szükséges hozzá (különben nem érem el a /dev/uinput-ot). A program C++-ban fut, alacsony memóriafogyasztással (G1-en max 2%). Az indításhoz és leállításhoz írtunk egy JAVA-s klienst. A hozzáférés nem titkosított, de jelszóval védett. A progi ingyenes, GPL alatt fut.

Forrás és az apk, Screenshot

Update:
0.94:

  • Nexus One támogatás (screenshot javítva)
  • Felcserélődhettek a leütött billentyűk gyenge wifi esetén. Javítva, most akár rövid időre meg is szakadhat a kapcsolat
  • Navigáló nyilak

Update:
0.97:

  • GPS pozíció lekérdezése (megjeleníti GoogleMapsen)
  • DynDNS támogatás
  • Ongoing notification ikon (kérésre)
  • sok bugfix

Update:
1.0:
Felkerült a Marketba Webkey néven. Gőzerővel folyik az AjaXplorer portolása, szóval nem sokára szép ajax-szal turbósított felületen lehet az sd kártyát böngészni, feltölteni, stb. Azután nekifogunk az SMS-eknek (küldés, listázás, exportálás).

Update:
Ezt az oldalt már nem frissítjük, lett külön weblapunk: http://androidwebkey.com/
T-mobile-nál muszáj proxyt használni a kapcsolathoz, mert a szolgáltató blokkolja a bejövő kapcsolatokat. Ehhez bérelünk szervert. Csomó új funkció, xda thread, minden nyalánkság :)

pz_atya, hud

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Hello, grat a programhoz. T-mobile Pulse-on próbálgatom, megy szépen. Kicsit lassan frissíti a screent, de amúgy frankó nagyon :)

A framebuffernek van egy kis lomhasága (ráadásul két darabot flippel, és nem tudom melyik az aktív), szóval az automatikus frissítés vár 1 másodpercet az utolsó művelet után. Ezt csökkenteni nem akarom, ígyis gyakran kell nyomogatni a Get Image gombot. Ezután a cyanogenmod-os G1-emen olyan 0.5-0.8 sec (függ a képernyő tartalmától is), míg kiolvasom a framebuffert, kiírom png-be (1-es zip tömörítés már kb. felére, harmadára összenyomja gyorsan, erőssebb tömörítéssel sem lesz sokkal kisebb a fájl), és átküldöm.

Eddig vagy 20-an letöltötték az apk-t. Ment? Használható? Mit tegyünk még bele?

Amint C-ből elérem a GPSt, lesz dyndns támogatás is, és lesz esély a lopott telefonok visszaszerzésére. Másik terv, hogy a futó processzeket jelenítem meg memóriahasználattal, illetve az sd kártyán lehessen átnevezni, sőt feltölteni is.

Nekem nagyon tetszik.

Esetleg be lehetne rakni egy status jelzést az "ongoing" -ba a notification barhoz, ha fut a service.

Az ongoing-os státusz jelzés gondolom C-ből nem elérhető, csak Javaból. A Javas megoldások nem szimpatikusok számomra: van egy progi, ami 5 percenként megrezegteti a telefont ha van nem fogadott hívásom. Ez a progi 11%-ot eszik a G1-em memóriájából, ami nagyon sok, ráadásul a dalvik is bármikor kilőheti. Ezért az alapötlet az, hogy kevés memóriafogyasztással futó szerver legyen (az első kapcsolódás előtt a memfogyasztás 1% alatt van) ami állandóan fut.

Szerk: a Java klienst író srác azt mondja, hogy akár megoldható. Azt nem látod, ha a C-s szerver valami hibával leállt közben, de azt igen, hogy a Javas kliens utoljára elindította/leállította a szervert.

Az idézett programnál szerintem valami nagyon el van szúrva a 11%-kal. Annak a funkcionalitásnak, amit leírtál, minimális memóriafelhasználással működnie kellene. A Dalvik nagyon sok mindent shared memoryból szed, ez mutathat csalóka képet a különböző memóriahasználatot kijelző alkalmazásokban, amik ezt nem jól kezelik.
Még azt tudom elképzelni, hogy ugyanabba a processzbe definiálták a background service-üket, mint amibe a user interfészük van, és emiatt a Dalvik akkor is benthagy részeket a memóriában, amikor egyébként nincs szükség rájuk. Megoldás lehet külön processzbe kell tenni a Service-t, UI classokat egyáltalán nem behúzni...stb.

Kilövés ellen ott a Service startForeground, aminek ráadásul meg is adhatod az ongoing Notificationt paraméterben. Ez az új API elvileg 2.0-tól van, de korábban is volt setForeground(). Egy blog a változásokról: Service API Changes

Persze ettől még a natív androcontrol processnek van értelme, csak igy meg lehetne oldani az ongoing notificationt, illetve ellenőrizhetné, hogy megvan-e még az androcontrol process.

Durvább hackelést igényel, de elvileg C-ből is kéne tudnod Intent-eket küldened Binderen keresztül. Ez persze nem publikus api, de a /dev/uinput sem az. Igy közvetlenül a C-s kód hívhatna Java-s activity-t (illetve inkább egy broadcast intentet küldene, amit egy receiver elkap, de ez most ebből a szempontból mindegy), hogy rakja ki / vegye le az ongoing notificationt. Így nem kell Java-s kódnak állandóan futnia, csak amikor státuszváltás van.

Üdv,
Gergely

Köszi a tanácsokat. Igazad van, shared library-k miatt látok több memóriahasználatot. A ps szerint az összes memóriahasználat 160%, míg a free szerint cache nélkül 77% foglalt. Chrootolt debian alól olvasom a /proc-ból.

A notification bar-t nézzük (egészen pontosan a másik srác). Mindenképp olyan megoldást akarunk, ami 1.5-ön is fut, csak közben van más dolgunk is.

Az intentek már érdekesebb téma. Jelenleg a progi tud telefonhívást indítani és a dialert előhozni megadott számmal. Ehhez a am (intent hívások) és service parancsokat használom, amikről elég kevés dokumentáció van (fórumokon ezzel példáloztak, szóval ezek mennek). Van ötleted hogyan tudhatnám meg, hogy a service list által felsorolt elemeket miként lehet hívni? A service forrását már néztem, de az csak továbbítja a hívásokat. Van ötletünk bőven: GPS pozíció, kontakt lista, sms küldés, stb.

Megoldva.

nalam nem megy :(

a logcat:

W/System.err( 2471): org.apache.http.conn.HttpHostConnectException: Connection to http://127.0.0.1 refused
W/System.err( 2471): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:133)
W/System.err( 2471): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
W/System.err( 2471): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
W/System.err( 2471): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348)
W/System.err( 2471): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
W/System.err( 2471): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
W/System.err( 2471): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
W/System.err( 2471): at com.androcontrol.AndroControl.comBin(AndroControl.java:239)
W/System.err( 2471): at com.androcontrol.AndroControl.refresh(AndroControl.java:91)
W/System.err( 2471): at com.androcontrol.AndroControl$2.onClick(AndroControl.java:157)
W/System.err( 2471): at android.view.View.performClick(View.java:2179)
W/System.err( 2471): at android.view.View.onTouchEvent(View.java:3828)
W/System.err( 2471): at android.widget.TextView.onTouchEvent(TextView.java:6291)
W/System.err( 2471): at android.view.View.dispatchTouchEvent(View.java:3368)
W/System.err( 2471): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
W/System.err( 2471): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
W/System.err( 2471): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
W/System.err( 2471): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
W/System.err( 2471): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
W/System.err( 2471): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
W/System.err( 2471): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1707)
W/System.err( 2471): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1197)
W/System.err( 2471): at android.app.Activity.dispatchTouchEvent(Activity.java:1993)
W/System.err( 2471): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1691)
W/System.err( 2471): at android.view.ViewRoot.handleMessage(ViewRoot.java:1525)
W/System.err( 2471): at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err( 2471): at android.os.Looper.loop(Looper.java:123)
W/System.err( 2471): at android.app.ActivityThread.main(ActivityThread.java:3948)
W/System.err( 2471): at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err( 2471): at java.lang.reflect.Method.invoke(Method.java:521)
W/System.err( 2471): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
W/System.err( 2471): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
W/System.err( 2471): at dalvik.system.NativeStart.main(Native Method)
W/System.err( 2471): Caused by: java.net.ConnectException: /127.0.0.1:80 - Connection refused
W/System.err( 2471): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:237)
W/System.err( 2471): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:521)
W/System.err( 2471): at java.net.Socket.connect(Socket.java:1019)
W/System.err( 2471): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:117)
W/System.err( 2471): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:129)
W/System.err( 2471): ... 32 more
E/AndroControl_java( 2471): ERROR: Connection to http://127.0.0.1 refused

A JAVA-s kliens elindítja a C-s szervert, majd http-n próbál hozzá kapcsolódni. A hibaüzeneted azt mondja, hogy http-n nem sikerült, de nem írja, hogy miért.

Az nagy segítség lenne, ha megpróbálnád kézzel elindítani:
adb shell /data/data/com.androcontrol/files/androcontrol
Ott jó eséllyel beszédesebb lesz.

Milyen telefonod van? Milyen mod?

T-mobile Pulse
1.7 MoDaCo ROM U8230 Vanilla

Szépen működik. Annyi gond hogy néha a kép elfelejt frissülni, ilyenkor egy kis unszolás kell neki (get image).

1 sec, amit várok az utosó művelet (billentyű, egér) után, mielőtt lehívom az új screent. Nem tudom, hogy a frissítés mennyi idő alatt zajlik le, ennyire nem másztam bele a javascriptbe (az img src-jét írom felül). Szeretnél egy extra checkboxot, amivel az utolsó művelet után kb. 3 sec, 6 sec elteltével is frissít? Vagy legyen ez a default?