• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    LWEEKAndroid development
    Diskuse o vývoji aplikací pro platformu Android.
    -----------------
    Tipy, Triky, Postřehy, Začátečnický help, Nápady na nové aplikace.

    Oficiální developerská stránka: http://developer.android.com
    Něco málo v češtině na WiKi android fora: http://wiki.androidforum.cz/index.php/Programov%C3%A1n%C3%AD
    Článek na Zrojáku: http://zdrojak.root.cz/clanky/vyvoj-pro-android-ii/

    Docela zajímavé tutoriály přímo od vývojářů ze Sony Ericsson:

    na tvorbu vlastního View adapteru
    http://blogs.sonyericsson.com/developerworld/2010/05/20/android-tutorial-making-your-own-3d-list-part-1/

    zajímavý nápad na zoomování jedním prstem - aneb vytváření gest
    http://blogs.sonyericsson.com/developerworld/2010/05/18/android-one-finger-zoom-tutorial-part-1/
    rozbalit záhlaví
    H_U_N_T_E_R
    H_U_N_T_E_R --- ---
    VICSYL: koupil bych si slušný android device (Nexus 4, 5, či 7). Na vývoj použij IntelliJ IDEA, Android Studio je nad ní postavený a eclipse projekty zvládá bez problémů
    DRIZDIK
    DRIZDIK --- ---
    VICSYL: Genymotion virtual
    VICSYL
    VICSYL --- ---
    Zdravim vespolek, s vyvojem pro Android nemam nejvetsi zkusenosti (nicmene nejaky mam). Patlam ted svoji prvni vetsi aplikaci a nejvetsim problemem je pro me efektivita vyvoje.

    a) pokub mi bezi emulator v eclipse, nemuzu skoro vubec nic delat, CPU jede na 100%. Restartovani emulatoru trva taky vecne...

    b) pokousel jsem se developit oproti svymu HTC desiru. Pry to je efentivni. Poprve mi to nabehlo skutecte temer hned. Ale pak uz jsem porad celil INSUFFICIENT_STORAGE_SPACE hlaskam. Mam prastary Android 2.2.2. Snazil jsem se vymazat data aplikaci, nektere odinstalovat nebo presunout na SD kartu. Pod "Nastaveni -> SD karta a pamet telefonu" vidim : Interni pamet telefonu -> dostupna pamet: 7,92 MB (ted, ale bylo to treba i 12 MB a porad mi to davalo INSUFFICIENT_STORAGE_SPACE). APK moji aplikace ma asi 1,5 MB, kdyz se mi ji podari naistalovat, vidim velikost applikace + data = 2.7 MB. Nechapu proto, proc mu to nestaci. Taky kdyz si tu aplikaci nainstaluju, vidim v seznamu aplikaci dve totozny ikonky moji aplikace. Evidentne to jsou jiny instance, protoze jedna nefunguje (zrejme nefungujici verze), druha je na posledni verzi. Kdyz ji odinstaluju, zmizi obe ikonky, ale pri pristi instalaci se ukazou zas... zrejme nejaky bordel, ktery jsem tam zatahl pri deploymentu z eplipse (?)

    c) pokousel jsem se zacit s Android studiem, ale Ztroskotal jsem na tom, ze muj project v eclipse jsem exportoval do Gradlu, pak se mi ho ale za boha nepodarilo naimportovat do Android Studia. Pravdepodobne by pomohlo zacit novy projekt a opatrne tam presunout zdrojaky z toho Eclipse projektu, ale to se mi zda az trochu hloupy ...

    Za kazdou radu budu rad. Je pravda ze jsem nepolozil hodne otazek, ale snad je jasny, jaky problemy bych rad vyresil....
    ROTTWEILER
    ROTTWEILER --- ---
    RADDINO: SOAP funguje stejně dobře i v Jave, ale rozhodně se nehodí na mobilní zařízení, kde se šetří každý KB a SOAP zrovna šetrný není. Jinak ten Xamarin si budeš muset koupit viz jejich stránky, možná mají i nějaké studentské věci. Nevím. Každopádně pokud si nikdy nedělal pro Android a nejsi zkušený vývojář, tak se připrav, že to bude trochu náročnější, protože všechny návody budou pro Javu a přenést do C# je půjde, ale nemusí to být nejtriviálnější.
    RADDINO
    RADDINO --- ---
    ROTTWEILER: Ve skautu máme velkej informační systém napsanej v c# a přemýšlel jsem, že bych jako BP udělal mobilního klienta (android) pro jeden z jeho modulů. Když jsem se s nima sešel, tak z nich vypadlo, že by byli rádi kdybych to udělal v xamarinu, aby to mohli případně dál rozvíjet a taky že to nějak líp pracuje s datama co oni posílají přes SOAP (tomu moc nerozumim, se SOAPem jsem nikde nedělal). V androidu (java) jsem dělal jenom okrajově, ale rád bych si to díky BP zkusil. Teď ale nevím, jestli se mám naslepo vrhnout do toho xamarinu a doufat, že to nějak pujde, nebo si vybrat jiné téma aplikace a udělat to normálně v javě.
    ROTTWEILER
    ROTTWEILER --- ---
    RADDINO: To dost záleží na tom, kdo to bude používat a pro jakou aplikaci. Pokud máš tým C# vývojářů a cílíš na všechny platformy potom ano. V opačném případě ne.
    RADDINO
    RADDINO --- ---
    delal jste nekdo pro android v c# pomoci xamarinu? nejaky zkusenosti?
    RADDINO
    RADDINO --- ---
    RADDINO: zamluveno
    RADDINO
    RADDINO --- ---
    Dostal jsem nabídku udělat jednoduchou appku pro Android. Jedná se o jednoduchou app pro mezinárodní skautskou akci která bude o prázdninách. Mají k dispozici slovníček se skautskými pojmy, kde jsou slovíčka v češtině a dalších 5 jazycích. Schání někoho, kdo jim z toho udělá app pro android. Bohužel nemám čas se tím zabývat, tak třeba by tu někdo měl zájem. Podle mě nejde o složitou app a mohlo by to pro někoho být příjemnej rychlej výdělek. Kolik za to přesně nabídnou nevim, ale kolem 5k bych řekl že ano. Kdyby měl někdo zájem, předám kontakt.
    DRIZDIK
    DRIZDIK --- ---
    GORG: Nejspis tam bude nejaka chyba v samotnem pouziti Android API, pokud se dostavas do ANR ..
    GORG
    GORG --- ---
    DRIZDIK: Sory, dostatečně jsem to nepodložil. Zdrojáky, co používám jsou součástí Google play services SDK. Ten GIT byl jen link na defakto identické použíté s nějakou marmeládou (ideaworks3d cosi, to jsem uvedl jen jako přímý link, abyste nemuseli stahovat celé SDK.. jsou defakto identické).

    Jde spíš o to, jestli tu má někdo zkušenost s tím Google play services, konkrétně s multiplayerem. Pak by asi věděl víc. Anebo jestli mi tu uniká nějaká typické chybné použití u android API jako takového.

    Včera jsem zjistil, že jsem se řídil návodem od googlu a zároveň používal zmíněné helper classy, ale když jsem koukal na sample použití, tak sdi řeším celou věc dvakrát. Všiml jsem si totiž, že zmíněný GameHelper class vytváří instanci GamesClient, ale já ho vytvářím taky.
    DRIZDIK
    DRIZDIK --- ---
    GORG: To co házíš je zavisle na te knihovne z ktere extendujes .. nikde nemuzu najit zrojak pro com.ideaworks3d.marmalade.LoaderActivity;
    Pokud chceš něco využívat, tak musíš mit možnost vidět, jak to funguje nebo si zkus s tím Play komunikovat nejdřív bez využití nějake třetí strany. Chyba bude v tvém vyuzití té knihovny com.ideaworks3d, ale pochybuju, že někdo má čas tady to procházet když pořád nevidí !tvoje zdrojaky! a jak to vlastně voláš. Ty copy pasty kousků kódu aniž bych věděl odkud, toho moc neřeknou.

    To je jako se ptát proč ti nejede auto, ale ukazovat, kde tankuješ benzin a kde parkuješ.
    GORG
    GORG --- ---
    Hmm.. v mém kódu GameHelper.java je:


    mGamesClient = new GamesClient.Builder(getContext(), this, this)
    .setGravityForPopups(Gravity.TOP | Gravity.CENTER_HORIZONTAL)
    .setScopes(mScopes)
    .create();


    Chybí tam .setViewForPopups(..).. Že by to bylo tím? Zdá se, že ten LoaderActivity je nějaká specifická věc pro tu knihovnu, co jsem linkoval níže (andengine.. ten nepoužívám) zatímco, když to není uvedené, tak je nějaká defaultní loaderactivity? To by asi problém nebyl.
    GORG
    GORG --- ---
    Jak tak koukám do toho kódu, tak to okénko "Welcome..." já asi jakési Popup okno...

    S tím by mohl souviset warning W/PopupManager﹕ You have not specified a View to use as content view for popups. Falling back to the Activity content view which may not work properly in future versions of the API. Use setViewForPopups() to set your content view

    v GameHelper.java je zmínka o popup:


    mGamesClient = new GamesClient.Builder(mContext, this, this)
    .setGravityForPopups(Gravity.TOP | Gravity.CENTER_HORIZONTAL)
    .setScopes(mScopes)
    .setViewForPopups(LoaderActivity.m_Activity.getWindow().getDecorView())
    .create();
    GORG
    GORG --- ---
    DRIZDIK: BaseGameActivity je class od googlu z balíčku sample, který handluje přihlašování.

    Je to součást SDK .. https://developers.google.com/games/services/android/quickstart

    Kód jsem našel třeba tu https://github.com/marmalade/s3eGooglePlayGames/blob/master/source/android/BaseGameActivity.java

    Hlavně tam jde o ten GameHelper

    https://github.com/marmalade/s3eGooglePlayGames/blob/master/source/android/GameHelper.java

    V logu nic relevantního nevidím.
    DRIZDIK
    DRIZDIK --- ---
    GORG: BAseGameActivity znamena ze delas s Andengine? Nebo pracujes s nejakou jinou knihovnou? Tohle je dost zavisle na tvem usecase, tak by asi bylo nejlepsi hodit zdrojak nekam na verejny git a poslat odkaz.
    V logu nic smysluplneho nevyskoci?
    GORG
    GORG --- ---
    No nepodařilo se mi ani najít, CO je vlastně zodpovědné za zobrazení toho okénka "Vítejte".. když krokuju ten kód v debugeru. Jakoby se tam nakufrovalo samo (už zřejmě z Google Play Services aplikace, která běží jako samostatný proces)

    Každopádně když se zapomene zobrazit (při zřejmě nějakých connection failure problémech), tak mi někam zmizí focus z mé hlavní aktivity. Vše je zobrazené, ale nejde na nic tapnout, a při pokousu o tapnutí to po chvíli oznámí ANR.

    Ale asi jsem našel souvislost... cyklí to někde v Activity.loop() // což je zjevně nějaká jen čekačka na messages ke zpracování.
    A bezprostředně to při chybě connection volá jakésí mConnectionResult.startResolutionForResult(mActivity, RC_RESOLVE);

    Nicméně v případě, že se to zahryzne, nedošlo k volání onActivityResult, které by to RC_RESOLVE ohandlovalo..
    Takže to občas někde zahryzne v nějaké jiné Activity resp. Intentu?
    GORG
    GORG --- ---
    Ad Android API a google play services - čím to mohlo být, že se to při přepínání mezi obrazovkami dostane aplikace do ANR?Prakticky nemůžu najít žádný replikovatelný vzorec, co je špatně. Dalo by se čekat, že někde běží nějaká nekonečná smyčka nebo se na něco čeká.

    Například se mi ukazuje "Vítejte Jméno uživatele", což je po úspěšném přihlášení, což řeší BaseGameActivity - potomek Activity, který dodal google jako sample, který zobrazuje malé okénko nad mou Activity poděděnou z BaseGameActivity. Nevím přesně, jestli je to modální okénko také nějaká Activity (přiznávám, že v androidím API dost plavu), ale všiml jsem si, že se to hryzne v situacích, kdy se nezobrazí.

    Asi tu z toho nikdo nic neodhadne, ale spíš by mě zajímalo, jestli nenarážím na nějaký obvious mistake při práci s Activitami.

    V situaci, když se nezobrazí to okénko se každopádně nevolá ani onPause ani onResume. (zkouším mačkat signOut, signIn, signOut, signIn atd. .. po několika pokusech to už prostě nezobrazí to okénko "Vítej...", ani nedojde k žádném onPause.. prostě už pak jen ANR.. bez jakékoliv chyby, tak přemýšlím, kde se tedy tou dobou může kód nacházet.. napadá mě, že asi někde v btom BaseGameActivity cyklí někde v tom kódu od týpků z Googlu... třeba na něco čeká marně, ale nechápu, proč UI nemá focus nebo hadnlování inputu, ale nezdá se mi, že v tom měli chybu oni)
    GORG
    GORG --- ---
    Aha, tak jsem zjistil, že chyba byla na mojí straně. V následujícím kódu. Už mi to dochází, překopíroval jsem ho z nějakého mého jiného projektu staršího, který není zkombinovaný s tím Google play services. Ten ještě předtím dělá nějaké Androidí API volání na layout (jak jsem zjistil krokováním), takže to pak řvalo java.lang.RuntimeException: Unable to start activity ComponentInfo{com.igorg.tester/com.igorg.tester.TesterMainActivity}: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
    po zavolání následujícího. Mylně jsem si to spojil s IDEA a GPS.


    RelativeLayout layout = new RelativeLayout(this);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
    View gameView = initializeForView(app, cfg); //using GL2

    RelativeLayout.LayoutParams adParams =
    new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
    RelativeLayout.LayoutParams.WRAP_CONTENT);
    adParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
    adParams.addRule(RelativeLayout.CENTER_IN_PARENT);
    layout.addView(gameView);
    setContentView(layout);



    Jinak ten DEX komplilační problém pomohlo všechno odimportovat, odstranit všechny moduly, dát Clean, a pak to tam dát znovu.
    GORG
    GORG --- ---
    Zkouším dnes rozchodit editor IDEA pro Android - už po nainstalování zjištuju, že bych ho fakt rád rozběhl, protože oproti Eclipsu je nesrovnatelně rychlejší - ten často zamrzává a někdy přepnout mezi v editoru na jiný java soubor trvá i 1 až 5 sekund.. na 3,4 Ghz 4 jádro, 8GB RAM mi to přijde mazec. IDEA je ve všech směrech zatím svižná jak blesk, zpravidla bezprostřední reakce, bravo! :)

    Ale marně se snažím rozchodit přilinkování Google Play Services, kde jsem se zprvu potýkal s chybou

    ERROR/AndroidRuntime(22324): FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo


    Vygoogloval jsem všelijaké rady, které jsou víceméně všelijaké triky, jak tu knihovnu přilinkovájí způsobem Zmáčkněte Project settings, odstraňte knihovnu, a pak ji znovu přidejte. Přidejte soubor dummy. java a tam vytvořte prázdnou třídu class Dummy {}. Pak dejte Import from existing code.... a zároveň se na židli kimácejte na pravou stranu, pak si udělejte kafe, přijďte odejte, a pak zkuste jiný návod, který v mírné obměně popisuje jiný postup :D

    http://stackoverflow.com/...stions/17960315/importing-google-play-services-lib-into-intellij-idea-12
    http://youtrack.jetbrains.com/issue/IDEA-96525
    http://stackoverflow.com/...exception-main-java-lang-runtimeexception-unable-to-start-activity-compo
    http://stackoverflow.com/...719263/unable-instantiate-android-gms-maps-mapfragment/13744765#13744765


    Ve výsledku jsem se dopracoval do jiného stavu, že už to nelze ani zkompilovat, ikdyž nevím, v čem se současná situace vlastně liší:

    Android Dex: [untitled] Unable to execute DX
    Android Dex: [untitled] com.android.dx.util.DexException: Multiple dex files define Lcom/google/android/gms/common/data/Freezable;
    ....


    Zjevně se tam něco přilinkovává vícekrát, ale přes různé rady na internetu podobného charakteru viz výše se zatím nedaří na tom nic změnit

    http://stackoverflow.com/questions/8059719/unable-to-execute-dex-multiple-dex-files-define

    Celá situace je navíc zkomplikovaná tím, že do toho tam ještě používám LibGdx, a importuju ještě svůj vlastně framework library projekt/modul + modul pro backend mého frameworku na Android, tak pořádně nevím, kam všude vlastně ty knihovny Google Play Services přilinkovat. Stejně tak android-support-v4.jar. Jestli do všech android projektů či jen toho hlavního. Moc tomu popravdě nerozumím v čem h lavně ten problém spočívá než to dělat podle nějakých návodů, kdy nevím proč. V Eclipsu mi to funguje, ale při snaze to linkovat ve stejném duchu to nepomáhá. Bez použití těch gogole services se mi už jinak android libgdx projekt na mobilu spustit v IDEA podařilo, ale s použitím to hází ten error zmíněný výše o ComponentInfo

    Any help would be helpful :) Díky.
    VIRTUALVOID
    VIRTUALVOID --- ---
    MELOUN: anyway, ja nemam moc co robit po veceroch (okrem hrania BF3) takze mozes ist aj cestou c.2
    VIRTUALVOID
    VIRTUALVOID --- ---
    MELOUN: it's a trap! ROTTWEILER :)
    Kliknutím sem můžete změnit nastavení reklam