• ú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í
    MIKULAS
    MIKULAS --- ---
    MAJACHUNATA: jo a notifikace by měla mít flexibilní čas per task - zaplatit nájem ve 12h (klidně v práci), vyluxovat v 18h (až dojdeš domů). Když bude v jeden den více tasku a ozvou se všechny naráz, člověk nezvládne všechny.
    MIKULAS
    MIKULAS --- ---
    MAJACHUNATA: asi by bylo lepší definovat, co chceš zkritizovat? Nebo spíše čeho chceš dosáhnout? Bez cíle to je těžký.

    Za mě je třeba zapracovat na UX, mazání a rušení věci vlevo, potvrzování vpravo (většina lidí drží mobil v pravačce).

    Vícejazyčnost - u takovéto appky must-have - úzce souvisí s UX, kdy by texty neměly přetékat kde nemají a zachovávat rozpaly, odstupy od dalších prvků i kdyby to bylo v němčině.

    Dokonalá prezentace na Google Play (zejména screeny "prodávají", i když je appka zdarma).

    Přidat možnost notifikace mailem.

    Přidat možnost dát k taskum ikonku a nebo alespoň barvu (kategorii).
    MAJACHUNATA
    MAJACHUNATA --- ---
    Zdravim, koukam, ze asi posilam do spatne diskuze vedle. Zkusim to jeste sem. Omlouvam se za duplikaci.
    Zkousim experimentalne malou appku. Je to me zkoumani terenu. Nechystam se na zadne komercni tazeni. Jen zkousim android coby prezentacni platformu pro me male programky.
    Aktualne se mi podarilo udelat open betu zcela jednoducheho programku sledujiciho ritualy uzivatele - razeni podle deadlinu a upominani. Nic noveho pod sluncem hadam. Kdyby mel nekdo z vas chvili na konstruktivni kritiku moc to ocenim.
    https://play.google.com/store/apps/details?id=cz.majachunata.rituals
    predem diky
    ADAMH
    ADAMH --- ---
    Ten google. Zkousim nahrat alphu aplikace na google play. Nove se to musi podepisovat pres apksigner nicmene

    https://developer.android.com/studio/command-line/apksigner
    "Caution: If you sign your APK using apksigner and make further changes to the APK, the APK's signature is invalidated. Therefore, you must use tools such as zipalign before signing your APK. "

    No takze nejprve udelam zipalign a pak apksigner a google play si stezuje ze to neni ziaplignovany. Kdyz to udelam opacne tak ocivinde si stezuje ze to neni podepsany.

    Je to dalsi pokus na to zvysit tlak na prechod na vendorlock in s apkbundle?

    Nemate funkcni postup na manualni generovani apk?

    Aktualne zkousim tohle

    ~/Android/Sdk/build-tools/30.0.0/zipalign -f -v 4 app-release-unsigned.apk aligned.apk
    ~/Android/Sdk/build-tools/30.0.0/apksigner sign -v --ks /---.keystore --ks-key-alias ------- aligned.apk

    Bez uspechu.
    DATEL
    DATEL --- ---
    JOHNY_G: díky, kouknu na to, ikdyž je to starší implementace přímo nad Camera2 API. Já jsem teď převáděl naši starou implementaci focení (nemůžu využít přímo camera picker, potřebujeme to mít ve vlastní správě) na nové CameraX API. Ono teda ve výsledku používá asi taky tu Camera2, případně Camera(1), ale zjednodušuje to značně implementaci. Problém je asi jen s tím Samsung Galaxy S8, ale co jsem tak dohledal, tak je to asi problém přímo toho zařízení. Úžasná rada z netu - když to přestane ostřit, zatřepej s telefonem a bude to zase v pohodě (a ono fakt jo :-D). Proto jsme v té staré implementaci pro Samsung telefony měli výjimku a používali staré Camera1 API, kde to ostření ze záhadného důvodu funguje. Mě už z toho Androidu vážně omejou :(
    JOHNY_G
    JOHNY_G --- ---
    DATEL: Camera API je paskvil, a proto mají všichni výrobci proprietární foťák a všechny ostatní aplikace fotí hnusně :-)). Jestli můžeš, použij prostě camera picker. Jestli nemůžeš, budeš muset na některých telefonech používat CONTROL_AF_MODE_CONTINUOUS_PICTURE namísto CONTROL_AF_MODE_AUTO. Třeba tady má implementovanou i tu podmínku, ale netuším, jestli zrovna tenhle kód funguje. Já jsem typicky používal nějaký framework nad tím (Vuforia a tak).
    DATEL
    DATEL --- ---
    Ahoj, implementoval jste někdo focení skrz CameraX API? Pokud ano, funguje vám autofocus, popřípadě focus po tapnutí na preview (s vlastní implementací samozřejmě) na Samsung telefonech? Ideálně konkrétně na S8?
    DRIZDIK
    DRIZDIK --- ---
    Pro ty co používají fastlane pro deployment, je k nečemu dobré pouštět ve fastlane pouštěné testy, když je mám i předtím v pipelině?
    KAERO
    KAERO --- ---
    DRIZDIK: jo, tak jsem tam nacpal i ty translation tools, a programy zajmu zadrou na pouziti bluetooth. ve chvili kdy ma nastat pripojeni tak spadnou. pritom z hostitelske masiny jsem schopen se tomu bluetooth zarizeni ozvat. emulace holt ma sve mouchy:(
    DRIZDIK
    DRIZDIK --- ---
    KAERO: To máš spíš jen špatné APK .. většina APK je vydávána pro více ABI (platforem) a v zájmu udržení velikosti APK jsou ty APK oddělené pro jednotlivé platformy a tys někde stáhnul ARM místo x86 a emulátor máš na x86.
    Ale jinak by translation tools měly být jen o drag&drop na emulátor
    KAERO
    KAERO --- ---
    Hm, tak genymotion je hezky, ale ten program nespusti, potrebuje arm translation tools a to zacina byt komplikovane.
    zacinam si myslet ze koupit nejaky tablet z druhe ruky by bylo skoro uz financne lepsi vzhledem k tomu kolik casu jsem na tom stravil...

    jenze problem je ze kdyz bude android primo na hw, tak nemuzu udelat jednoduchou zalohu stavu jako treba ve virtualboxu

    cert vem android, nemam ho rad :(
    DRIZDIK
    DRIZDIK --- ---
    KAERO: Mají i desktop, pro personal use se dá stáhnout zdarma. Sám jsem ho už dlouho nepoužil, ale byl to asi nejlepší emulátor. https://www.genymotion.com/fun-zone/
    KAERO
    KAERO --- ---
    ech, omlouvam se, puvodne jsem to chtel napsat do linuxoveho auditka a pak jsem si uvedomil ze tady to bude smysluplnejsi. mam linux ubuntu 18.04.

    MIKULAS: dik, bohuzel je to jen pro windows/macos.

    STARF: aha, dik, zkusim dohledat. vcera jsem jeste resil problemy ze AVD se nechce poustet, zatim googlim a pomalu postupuju jak to vubec rozchodit.

    DRIZDIK: hm, jsem z toho uplne zmateny. tak je jenom cloud nebo i desktop? je jen placeny nebo i zdarma pro osobni pouziti? nachazim na jejich strankach rozporuplne informace.
    DRIZDIK
    DRIZDIK --- ---
    KAERO: Ten Genymotion by měl být dobrý, nezavrhoval bych ho tak rychle.
    STARF
    STARF --- ---
    KAERO: Nevim, co mas za OS.. kazdopadne pochopitelne jde Android Emulator pustit bez AS.
    Na macOS takto (jestli mas jiny system, dogoogli si treba "run AVD without Android Studio"):

    ~/Library/Android/sdk/tools/emulator -list-avds
    cd ~/Library/Android/Sdk/tools && ./emulator -avd Pixel_3a_API_29
    KAERO
    KAERO --- ---
    Chtel jsem poustet nejake programy, co jsou jen na androidu. Ale nechci si je strkat na telefon ("aplikace" Lego Boost, ovladani cinskeho robota). Tak jsem se kouknul na moznosti virtualizace androidu v linuxu.

    Jel jsem podle tohoto navodu:
    Best Way to Run Android Apps and Games on Linux – Linux Hint
    https://linuxhint.com/android_apps_games_linux/
    Anbox: funguje, ale jen pro nektere programy. Treba ctecka knih v poho, ale ty co potrebuju ne - zobrazi se jen prazdne okno. Problem s graficky narocnejsimi programy?
    Arc Welder: opet, nektere programy jedou, ty co potrebuju ne.
    Genymotion: cloud nechci, mam rad veci doma na svem disku.
    Android-x86: reseni pres virtual box - to vypadalo dobre. Bohuzel ale casto programy uvnitr padaji, treba google play jsem spustil az na potreti, a pri aktualizaci zase chyba. Pisou ze je potreba dat vice procesoru, ale ani 4 nepomohly. Nedohledal jsem kde je problem.
    Android Studio IDE: pripada mi ze tohle neni pouzitelne na pravidelne spousteni nekolika androidich programu. Jde ta virtualizace postet bez celeho vyvojoveho prostredi? Jeste jsem to uplne nerozchodil.

    Tak nejak jsem mel pocit, ze to s androidem bude jednoduche. Jeden balik z repozitaru a budu mit kompletni virtualni android. Ale ono ne.

    Virtualizujete nejak android? Minul jsem nejakou moznost?
    CNV
    CNV --- ---
    ADAMH: Takže postarat se o to ručně. Dík, to jsem chtěla vědět.
    ADAMH
    ADAMH --- ---
    CNV: Pri kazde zmene zvysit cislo verze SQLiteOpenHelper a v onUpgrade vyresit adekvatni zmenou, tj alter table pro upravy, create table pro nove tabulky.

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    if (oldVersion <2) {

    db.execSQL("create table blabla("
    + "_id integer primary key,"
    + "blabla integer,"
    + "blabla2 int"
    + ");");

    }

    if (oldVersion <3) {

    db.execSQL("ALTER TABLE blabla ADD COLUMN blabla2 integer");
    }
    CNV
    CNV --- ---
    Mám začátečnický dotaz. Mám v aplikaci SQLite databázi, ve které jsou tabulky s různými položkami a jedna tabulka, jejíž obsah mění uživatel (v aplikaci si zaklikává, které z těch položek má a kolik kusů). Když do databáze přidám další tabulky a rozešlu uživatelům nové APK, přepíše se jim komplet databáze, nebo se jen přidají nové tabulky?

    Snažím se pochopit, jak updaty fungujou, ale literatura a tutorialy se těmahle "drobnostma" moc nezabývají :)
    ADAMH
    ADAMH --- ---
    JOHNY_G: Dik,
    1) zkusim, koukam ze mam nejakou 3.6 a uz je venku 4.0
    2) zkusim zda to bude na to atributy v xml reagovat v kdyz ne tak pres tu javu, nejak si prepisu.
    JOHNY_G
    JOHNY_G --- ---
    ADAMH:
    1) Tohle vypadá na bug, jestli jsi do toho opravdu nijak nezasáhl. Zkus jinou verzi Android Studia, Build Tools, SDK... Nebo si to prostě udělej ručně podle nějakého tutorialu.

    2) Pokud používáš výhradně navigation components, tak se backstack řídí atributem popUpTo. Prakticky ti pokryje všechny běžné scénáře v momentě, kdy pochopíš root node (u tebe to bude asi @id/mobile_navigation, prostě ID elementu navigation ve tvém navigačním grafu) a popUpToInclusive. Je to ovšem poměrně neintuitivní, takže se obrň trpělivostí, a navíc to neřeší některé edge casy, typicky na starších Androidech. Takže se můžeš dostat do situace, kdy musíš přetížit onBackPressed a/nebo onSupportNavigateUp v aktivitě (není to totéž, i když se to tak bohužel v praxi často používá).

    Dám ti na to i příklady, ale jen v Kotlinu, protože jsem líný zrovna tohle přepisovat do Javy, kde by to byl nesrovnatelně delší kód.

    Mám dva jednoduché interfacy, které můžou a nemusí Fragmenty implementovat:
    interface IOnBackPressed {
        fun onBackPressed(): Boolean
    }
    
    interface IOnUpPressed {
    	fun onUpPressed(): Boolean
    }

    Aktivita se vždycky zeptá Fragmentu, jestli si to ohandluje sám:
    override fun onBackPressed() {
    	val fragment = nav_host_fragment?.childFragmentManager?.primaryNavigationFragment
    	// Teď se zeptám jestli mám vůbec referenci na aktivní fragment, jestli implementuje IOnBackPressed, a pokud ano, tak jestli ho ohandloval/zkonzumoval
    	if ((fragment as? IOnBackPressed)?.onBackPressed() != true) { 
    		super.onBackPressed()
    	}
    }
    
    override fun onSupportNavigateUp(): Boolean {
    	val fragment = nav_host_fragment?.childFragmentManager?.primaryNavigationFragment
    	return if ((fragment as? IOnUpPressed)?.onUpPressed() != true) {
    		// Tady se ještě zeptám navControlleru, jestli se měl kam vrátit; pokud ne, tak byl uživatel v rootu a ve skutečnosti kliknul v toolbaru nikoli na šipku, ale na ikonu menu, takže potřebuju otevřít hamburger menu.
    		// Ne vždycky se to musí řešit takhle, ale já mám v tomhle projektu z businessových požadavků dost komplikovanou definici rootu :-D
    		if (navController.navigateUp(appBarConfig)) {
    			true
    		} else {
    			drawer_layout.openDrawer(GravityCompat.START)
    			false
    		}
    	} else {
    		true
    	}	
    }

    A jednotlivé fragmenty mi oznámí, jestli mají nějakou tu výjimku. Pokud ji nemají vůbec, tak ty interfacy vůbec neimplementuju, ale můžou prostě vracet false:
    // Tenhle fragment se vždycky šipkou v toolbaru vrací na homescreen, ať se tam šlo odkudkoli, neboť si to klient přál a na legacy Androidech zlobí popUpTo do rootu
    override fun onUpPressed(): Boolean {
    	navController.navigate(ResultFragmentDirections.goToHome())
    	return true
    }
    
    // Tenhle fragment používá na přáni klienta custom klávesnici, takže emuluji chování té systémové, která se tlačítkem zpět nejprve schová (a hodnotou true zabrání aktivitě návrat ve stacku) a až když je schovaná, tak dalším stiskem vyhodí false a nechá aktivitu dělat její práci.
    // To je třeba hezký příklad toho, že back (tlačítko/gesto) není to samé jako up (šipka v toolbaru), protože tam se vracíme rovnou, klávesnice neklávesnice:
    override fun onBackPressed(): Boolean {
    	if (viewModel.keyboardShown.get()) {
    		viewModel.keyboardShown.set(false)
    		return true
    	}
    
    	return false
    }

    Jak vidíš z těch příkladů, jsou to vážně edge cases, které v zásadě odporují konvencím platformy. Když ti nedýchá na záda klient, měl by sis vystačit s navigačním grafem.
    Kliknutím sem můžete změnit nastavení reklam