Keresés

Új hozzászólás Aktív témák

  • Kutyauto

    csendes tag

    Sziasztok,

    Android Studioban próbálkozom egy alap tanfolyam után. Egyszerűbb kis appok már mennek.
    Pályamódosításként kezdtem bele, de már látom hogy valószínűleg csak hobbi marad... azért csinálom, amikor szórakoztat, hátha lesz valami.
    A kérdés: A benne lévő AVD emulátort használom. Sajna szinte minden nap törölni kell és újra kell telepíteni , mert megdöglik, nem tud elindulni. Jó, hogy pár kattintás, de például az emulátoron átállított nyelv, meg ilyesmi mindig elvész és az már macerásabb. Valamit nem jól csinálok, vagy hogy lehetne ezt elkerülni? (általában csak hibernálom a gépet amikor nem használom, de úgy vettem észre mindegy neki ha rendesen leállítom is.)

    [ Szerkesztve ]

  • Kutyauto

    csendes tag

    válasz Zsoxx #5442 üzenetére

    Üdv, Köszi, hely van bőven meg a memória is szerintem elég kell legyen 64 MB. Nem egy friss gép ez, de 4 éve elég jónak számított.

  • Kutyauto

    csendes tag

    válasz Zsoxx #5448 üzenetére

    Köszi, még nem láttam. Az egyik javaslatot most megcsináltam, majd kiderül mozdít-e valamit.

  • Kutyauto

    csendes tag

    válasz Zsoxx #5448 üzenetére

    Hát jó eddig nem lett. Azt vettem észre, hogy amikor elsőre nem bírom elindítani olyankor beragad a memóriába egy emulator.exe meg egy emulator64-crash-service.exe és egy qemu-system-x86_64.exe nevű program. Ha azokat mind kilövöm, akkor következő manuális indításra elindul rendesen.

  • Kutyauto

    csendes tag

    Most épp egy játékot csinálok, amiben vannak animációk, timeres dolgok is. Egy-egy lépés után le kéne fussanak a dolgok és mindaddig nem kéne szabad legyen bele kattintani a képernyőbe.
    Evvel szívok, próbálom változóval megoldani no de mindenhová ifeket írni elég macerás. És még csak nem is nagyon működik, folyton összeakadnak a rutinok egymással. Nem találtam olyat, amivel egy lépésben tiltani tudnám az interakciót. Marha szokatlan nekem ez a többszálú működés. Sokat Foxproztam, ott szépen egymás után futottak a dolgok, meg kellett szenvedni ha nem úgy akartad. Itt meg fordítva...

    [ Szerkesztve ]

  • Kutyauto

    csendes tag

    válasz Zsoxx #5452 üzenetére

    Igen, az első kettőt megcsináltam. Amikor van kedvem foglalkozom vele.

  • Kutyauto

    csendes tag

    válasz thiclyoon #5454 üzenetére

    Hát én tényleg csak kezdő vagyok ebben a rendszerben, nem egy mutatni való minőségű kód ez. Mindent kipróbálok ami szembe jön, aztán ha már megtaláltam, kitököltem akkor sem törlöm ki ha mégsem akarom használni, csak kikommentelem. (Mint pittyegés, wav lejátszás, rezegtetés meg effélék) Szóval katyvasz még.

    A lényeg, hogy van egy fragmentem, abban egy frame layout.
    Ebbe a layoutba futás idő alatt kóddal helyezek el egy csomó egyforma ImageView objektumot. A végeredmény úgy néz ki kb. mint egy sakk tábla.

    Minden ImageView ugyanazt a timer kódot futtatja kattintáskor. Mindenféle kiértékelések , és akár hat elemen is animációk futtatódnak. Ennek mind le kéne mennie és a köv. kattintásnak csak ezek után kéne lehetővé válnia. Leegyszerűsítve, áttekinthetősítve ilyen volna:

    var Clickable:Int = 1 // segéd változó ez jelzi, hogy kattinthatók-e éppen az elemek.
    var AnimCount = 0 // segéd változó amiből az utoljára befejeződő animációnak látnia kéne, // hogy a Clickable-t neki kell visszaállítania 1-re.
    var ViewList: MutableList<View> = mutableListOf<View>()
    // segéd lista amit kezelgetek - a gépi válaszlépés használja.
    var GuestTheNext:Int =1 //ki lép következőre ?

    /*ImageView click kód*/
    ImageView.onClickListener{
    if (Clickable==1){
    onClick()
    } // onClickListener vége
    }

    fun onClick()
    {
    Clickable = 0
    /* itt vannak még egyéb dolgok, változókat állítok, képeket cserélek vezérléseken, ilyesmik*/
    click_timer.start() // itt indulna egy timer, ami kis időt ad a usernek érzékelni a képernyőn //történt változást, majd értékel és visszaállítja a képernyőt várva a köv. //lépést.
    }
    /*ImageView click kód vége*/
    /* timer kód*/
    val click_timer = object : CountDownTimer(500, 500) {
    override fun onTick(millisUntilFinished: Long) {}

    override fun onFinish() {
    /*animáció meghívása két adott objektumra*/
    Remanim(ActiveView1)
    Remanim(ActiveView2)
    /* ... itt egy csomó egyéb művelet, elágazás stb.*/
    /*animáció meghívása további objektumokra*/
    Remanim(fw_binding!!.imageViewB)
    Remanim(fw_binding!!.imageViewC)
    Remanim(fw_binding!!.imageViewJ)
    } //OnFinish vége
    } /*timer kód vége*/

    /*Az animáció*/
    fun Remanim(view: View) {

    view.animate()
    .setDuration(500)
    .rotation(360f)
    .translationY(0f)
    .alpha(0.0f)
    .setListener(object : AnimatorListenerAdapter() {
    override fun onAnimationStart(animation: Animator?) {
    super.onAnimationStart(animation)
    AnimCount++
    }

    override fun onAnimationEnd(animation: Animator) {
    super.onAnimationEnd(animation)
    /* itt vannak még dolgok, pontszám kiírása ilyesmik*/
    if (AnimCount <= 1) {Clickable = 1}
    AnimCount--
    view.visibility = View.INVISIBLE
    ViewList.remove(view)

    if (GuestTheNext == 1) GuestTheNext= 0 else GuestTheNext= 1 //játékost cserél

    if (GuestTheNext==1){
    guest_timer.start() // itt hívódna a vendég játékos, illetve a gépi válasz lépése. tulképp ő is az // onClick() függvényt fogja hívni, csak másik View paraméterrel.
    }
    }
    })

    Lényegében a változókkal variálás nélkül simán szét lehet kattintani a képernyőt míg a timer meg az animációk futnak. Végső soron ezzel a variálással sem tökéletes.
    Ha elég vadul tapizom a képernyőt akkor szétesik a kód, kétszer egymás után is ugyanaz a játékos tud lépni.

  • Kutyauto

    csendes tag

    Egyébként más is küzd ilyennel, ez itt erről szól :
    https://stackoverflow.com/questions/10987633/disable-all-touch-screen-interactions-while-animation

    De igazából nem így kéne megoldani, hanem ráérezni ennek a többszálúságnak a lényegére és úgy szervezni a kódot, hogy jó legyen.

    Gondoltam aztán, hogy csinálok saját osztályt a FrameLayout ból aminek csinálok setClickableAll(mode:Int) metódust ami minden elemre beállítja amit paraméterbe kap ilyesmi ciklussal... de a programból hozzáadott elemeket nem találtam meg a getChildCount()-tal... mintha nem is volnának.

    for (int i = 1, i < layout.getChildCount(), i++) {
    TableRow row = (TableRow) layout.getChildAt(i)
    row.setClickable(false)
    }
    No, szóval küzdök mint malac a jégen... Ilyen hosszadalmas és kevéssé egzakt problémákkal nem terhelnélek titeket, de ha lesz könnyen azonosítható kérdésem, akkor mindenképp megjelenek vele... :R

  • Kutyauto

    csendes tag

    válasz Kutyauto #5455 üzenetére

    Végül is talán feleslegesen bonyolultan csináltam. Működik, de még mindig meg lehet bolondítani.
    Csak az AnimationEnd állítja vissza a kattinthatóságot, de még javában forognak az animációk a képernyőn amikor már rá tudok kattintani és lefut ismét a click.

  • Kutyauto

    csendes tag

    válasz thiclyoon #5457 üzenetére

    Van anyagom az enumra, volt róla szó de nekem újdonság, nem is jutott eszembe.
    Most az a szituáció, hogy ugyanazon a gépen játszom. Nincs élő partner, a gép lép egy timerrel, aztán megint én. A gép lépése után ugyanúgy elindulnak az animációk amikor olyan a szitu. És én úgy veszem észre, hogy ha egymás után elindítok 6 db animációt akkor sosem fogom tudni hogy melyik ért véget utoljára, hogy az kapcsolja majd vissza a lépés lehetőségét.(ezt próbáltam áthidalni az AnimCount változóval) Ráadásul úgy veszem észre ha az AnimationEnd metódusban visszaállítom a lépés lehetőségét (Clickable=1 ), majd rögtön köv. sorban eltüntetem (Invisible) a kiesett ImageView-t... hiába... már rég le van futva a két sor, mikor (ha elég gyors vagyok) még mindig rá tudok bökni az elemre amire már nem volna szabad tudnom rábökni. Vagy elvétek valami sorrendet, logikát, vagy ez ilyen... nem tudom.
    Lényegében most megoldottam hibátlanra egy plusz timer beépítésével és túl is gondolom bizonyos szempontból, hiszen ha hálózaton másik játékossal fog menni a játék (amit célom lesz beépíteni NodeJS alapon) akkor bőven lesz idő mindennek lefutnia míg a kommunikáció lezajlik.

    Amúgy is minden nap ezer dolog merül fel amibe belebotlok és nem értem de meg kell tanulnom hogy így van és kész.
    pl. van a gombnak strikeColor meg strikeWidth tulajdonsága amit az xml-ben be tudok állítani de futásidőben már nem érhetők el. Vagy hogy használni tudom a setBackColor függvényt, de lekérdezni a gomb aktuális színét csak egy külön furmánykodással lehet. Persze ezt a furmánykodást beépíthetném egy saját funkcióba, ilyenekből épül aztán az embernek egy saját függvénykönyvtára és kész.
    Apropó, az pl. nem lett kibeszélve a tanfolyamon, hogyan épül fel ideális esetben egy ilyen rendszer. Saját, több külön projektben újra és újra felhasználni tervezett osztályokat, funkciókat hová kell tenni? Hogy ugyanúgy lehessen aztán behúzni őket egy új projektbe saját gépről, mint a többi függőségeket.

    Vágom a fát szorgosan, de nem látok a szálló forgácstól... :)

  • Kutyauto

    csendes tag

    válasz thiclyoon #5460 üzenetére

    Köszi a linket, hasznos lesz.
    Valamikor tudtam írni elég szakszerű felépítésű dolgokat.
    Talán ebben az új rendszerben is eljutok valami értelmezhető szintre előbb-utóbb.

  • Kutyauto

    csendes tag

    Tudja valaki hogyan lehet emulálni a mobil megrázását (shake) az emulátoron ?
    CTRL+M kombinációt olvastam, de nekem a CTRL csak két pöttyöt pakol fel a képernyőre, azokat sem tudtam megfejteni mire volnának valók, de rázást nem sikerült előállítani sehogy.

  • Kutyauto

    csendes tag

    Sziasztok,

    BÚÉK mindenkinek!

    Van az a dolog, hogy ha nem tiltom le a képernyő forgatást, akkor újraindul az egész cucc a forgatás után és elveszik az alkalmazás teljes állapota.
    Egyelőre a fix orientációt használom, de kísérleteztem használni az "onSaveInstanceState"-et meg a párját...
    Szimpla kulcs-érték párok mennek azzal nincs is baj, de van nekem egy rakás másféle objektumom is amiket meg kéne tartani.
    Mint például egy ilyen
    var MatrixDraw = mutableListOf<MyImageView>()
    változót, amiben van egy lista spéci ImageView objektumokból, saját beállított propertykkel meg ilyesmi.
    Az ilyenek kimentésére-visszatöltésére nem találtam működő megoldást sehol.

    Nem tudtok olyasmi megoldást, aminek csak megadom a kulcsot, meg az értéket, aztán ő elvacakol a megfelelő metódus kiválasztásával, konvertál típust ha kell.... szóval megoldja a kimentést, visszatöltést bármire amit a memóriában találok ?

  • Kutyauto

    csendes tag

    válasz thiclyoon #5466 üzenetére

    Köszi, a viewModel lesz a jó kulcsszó. Tanultam az Activity életciklusokról és a saveInstanceState-ről, de nem emlékszem hogy a viewModelről lett volna szó. Persze nem kizárt, de nem emlékszem rá. A tanfolyam harmadik részét nem vettem meg, ott egész biztos előkerült volna. De mindegy, ennyi már elég, holnap majd utánaolvasok.

  • Kutyauto

    csendes tag

    válasz Kutyauto #5441 üzenetére

    "...A kérdés: A benne lévő AVD emulátort használom. Sajna szinte minden nap törölni kell és újra kell telepíteni , mert megdöglik, nem tud elindulni. Jó, hogy pár kattintás, de..."

    Evvel kapcsolatban megírnám csak a rögzítés kedvéért, hogy mióta ( 8-10 napja talán ) átállítottam az emulátort arra, hogy teljesen külön ablakban induljon és fusson, azóta a fenti probléma nem fordult elő.

  • Kutyauto

    csendes tag

    Sziasztok,

    Már megint összerúgja a bokámat ez a többszálas korutinos dolog...
    van a MainActivity aminek az OnCreate- jében akarok csinálni számos Room adatbázissal kapcsolatos dolgot. Egy része megy, amiknek a befejezésére nem kell várnom. (létrehozás, feltöltés csv fájlból default értékekkel stb...)

    Viszont például kiolvasni már tárolt értékeket adatbázisból és UTÁNA azoknak megfelelően futtatni tovább az onCreate-t .... ez nem sikerül.
    Mivel az async().await csak suspend függvényben működik, az onCreate meg nem engedi magát suspend deklarálni.

    Csűrtem és csavartam mindenfelé, de elakadtam vele... :F

  • Kutyauto

    csendes tag

    válasz bandi0000 #5474 üzenetére

    Hát igazából ez a sor
    var setup = AppDatabase.getInstance(mycontext).gradeDao().getsetup()

    ami lekérdezné a tárolt beállításokat panaszkodik rá, hogy nem tud ő a fő szálon futni.

    Erre aztán kipakoltam egy funkcióba, hogy majd az lekéri és beállítja amit kell.. de persze ezt se tudom hívni onCreate-ből, tehát amúgy sem volna jó.
    Az egész földhözragadt sorról-sorra világképemmel van baj.
    *****************
    import android.util.Log
    import com.example.rapidsk.*
    import kotlinx.coroutines.GlobalScope
    import kotlinx.coroutines.async

    suspend fun loadSetup() {
    var setup: Setup? = null
    val cSql = AppDatabase.getInstance(mycontext)
    GlobalScope.async {
    try {
    var setup = AppDatabase.getInstance(mycontext).gradeDao().getsetup()
    } catch (e: Exception) {
    Log.e("loadSetup hiba", e.message!!)
    }
    }.await()

    pnSounds=setup.voice
    pnBuzz=setup.buzzer
    ActualMatrix = setup.matrix
    ActualLevel = setup.level
    }
    ********
    Pár hete kicsit Node.js -el is foglalkoztam, abban is eljutottam valameddig, az ottani async is bekavarhat. Később majd az volna az elképzelés, hogy MySQL + Node volna középen, a kliensek oldalán meg mennének az Android appok.

    De most jól összekeveredett a fejemben minden, túl sokféle újdonságot olvastam meg írtam össze túl gyorsan. Talán túl öreg vagyok én már ehhez. :-/

  • Kutyauto

    csendes tag

    válasz bandi0000 #5476 üzenetére

    Hát igen, össze vissza alakulnak ki a dolgok, nem lehet mindig lépésről lépésre haladni.
    Sokszor kell visszamenni, átdolgozni,kipróbálni más megoldást is... Korábban is így boldogultam, csak talán egyszerűbb volt az az eszköz, meg nem voltak olyan berögződött elképzeléseim mint most.

    Végül kipróbáltam a ViewModeles megoldást is.

    Az initjébe betettem a lekérdezést így :
    init {
    var setup: Setup? = null
    try {
    viewModelScope.launch(Dispatchers.IO) {
    setup = AppDatabase.getInstance(mycontext).gradeDao().getsetup()
    if (setup != null) {
    this.pnSounds = setup!!.voice
    this.pnBuzz = setup!!.buzzer
    this.ActualMatrix = setup!!.matrix
    this.ActualLevel = setup!!.level
    }
    }
    } catch (e: Exception) {
    Log.e("loadSetup hiba", e.message!!)
    }


    }

    És így jó. Így is csak a viewModelScope.launch(Dispatchers.IO) megoldással megy.

    A lifecycleScope nem tudom miből jönne (**), nem tudtam beimportolni sehogy. De a scope és launch szavak alapján a

    LifecycleCoroutineScope.launch() -ot
    meg ezt a
    viewModelScope.launch() -ot találtam. Utóbbit választottam, mert nem kért importot és maradt is mert így működik.

    (**)
    Ezeket az alábbi Gradle sorokat beletettem, de sehogy sem akarta...
    def lifecycle_version = "2.2.0"
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"

    Köszi a tippet.

  • Kutyauto

    csendes tag

    válasz bandi0000 #5478 üzenetére

    Köszi... No küzdök vele, haladok lassacskán.
    Ez az egész abból jön, hogy próbálom megcsinálni azt az indításkori műveletet, amit az egyszálú Foxproban leegyszerűsítve anno valahogy így csináltam...

    llRet = true
    IF ( Nincs meg a helyén az adatbázis? ) // nem futott még, vagy letörölték, átnevezték...
    llRet = Adatbázis létrehozása()
    IF (llRet)
    llRet = Tábla1 ellenőrzése / létrehozása / feltöltése()
    ENDIF
    IF (llRet)
    llRet = Tábla2 ellenőrzése / létrehozása / feltöltése()
    ENDIF
    ..... és így tovább
    ENDIF

    IF (llRet)
    // futott már és/vagy elvileg kész a háttér
    llRet = Adatkörnyezet beállítása ()
    ENDIF

    Return llRet
    ... ha itt False , akkor nincs értelme tovább futni, mert előbb utóbb hiányozni fog vmi...

    Itt nyilván minden egyes sort meg kell várni, mert ha valamelyik bármilyen hibára megy akkor a többit nincs értelme futtatni, elindulni sem lehet. Hát igen, ilyenkor az ember kitett egy szép folyamat jelzőt, az user meg szépen kivárta a végét...
    Ezt nekem nagyon nehézkessé teszi kezelni, ha minden egyes adatbázis műveletet külön szálban, vagy launch ban kell indítani és az indító kód fut közben tovább. Szerintem ez is a Node.js tanfolyamon megismert Pyramid of doom vagy Callback hell helyzet, amit ott async - await()-ekkel oldanak fel.
    No, ezt próbáltam itt is megérteni és kibogozni, de lehet hogy alapból rossz végén akarom megfogni a kapát... Bocs ha fárasztó vagyok :-)

  • Kutyauto

    csendes tag

    No volna egy hétköznapibb bajom is, talán vkinek ismerős...

    Van a Studioban a Tools->Kotlin-> Kotlin REPL nevű eszköz... olyan command line féle

    Ez nem indul el nekem, ezt írja:
    `CommandLineWrapper` is ill-suited for launching apps on Java 9+.
    If the run configuration uses "classpath file", please change it to "@argfile".
    Otherwise, please contact support.

    Ha a Run->Edit configurations-> Edit config templates menüben a Kotlin és Kotlin Script lapokon az Environment variables mezőbe beírom hogy classpath=@argfile , akkor elindul... de hiába tárolódik el, legközelebb megint ugyanaz a baj ismét be kell lépnem és leokézni hogy elinduljon. Amit lehetett már frissítettem.

  • Kutyauto

    csendes tag

    válasz bandi0000 #5481 üzenetére

    No igen ez alapból jó ötlet.... azon a szinten amin most bolyongok Androidban.
    De később szeretnék tovább lépni MySql felé , illetve Repository-t is használni.

    Korábban úgy csináltuk, hogy amikor mondjuk kiadtunk egy új programfájl verziót ami mondjuk adatbázis módosítást is igényelt / tartalmazott, és a felhasználói hálózaton vki megpróbálta lefrissíteni a programját, akkor a progi lefrissült, majd az indulásakor kinézett az SQL-re és ha más nem volt rajta bejelentkezve, akkor megfrissítette az adatbázist is a saját magasabb verziójára és szépen elindult.
    A többiek a köv. induláskor persze nem tudtak belépni csak programfrissítés után.
    Errefelé gondolkozom most is távlatilag, ezért küzdök ilyesmikkel.

  • Kutyauto

    csendes tag

    Van egy mutable listám, vannak benne objektumok.
    Sorba rendezem a lista.sortBy{it.property} módszerrel, majd végigmennék rajta és végeznék írási műveleteket benne, és eközben egyszer csak elvész a beállított sorrend... ezzel bajlódok épp.
    Eleve bajom volt, mert a benne lévő objektumok saját classból vannak és a saját propertyre akartam a sorrendet beállítani. Ez csak úgy működött, ha a classban a propertyt
    @JvmField var Property:String =""
    módon adtam meg, egyébként kaptam egy Illegal access hibát a sortBy-ra . Ezt kigugliztam, de most meg avval szivat, hogy elvész a beállított sorrend menet közben.

    Elfáradtam bele, csinálok egy kis fizikai melót...

    [ Szerkesztve ]

  • Kutyauto

    csendes tag

    válasz BE4GLE #5484 üzenetére

    Köszi a tippeket, utánaolvasok, ki fogom próbálni amiket nem ismerek belőle.

    Sok mindennel játszom, kísérletezem amibe belebotlok... igazából csak a tapasztalás, tanulás kedvéért írogatom amiket most csinálok. Érdekes, hogy pár programsorral olyan funkciókat lehet megvalósítani, mint az írott szövegek felolvasása... ugyanakkor például éppen ebben jött elő, hogy ha előkészítem
    tts = TextToSpeech(mycontext, ttsListener )


    majd a listener initjében szeretném beállítani a default lokációnak megfelelő hangot ...

    val voice = tts?.voices?.first { it.locale== Locale.getDefault() && !it.isNetworkConnectionRequired}
    if (voice != null) {
    tts?.setVoice(voice)
    }

    Hát a tts.voices egy 389 elemű lista, amelyből nekem csak az a 2-3 elem kell, ami megfelel néhány paraméternek. Ennek a listának a szűrése ( .filter{} ), keresni benne ( .first{} ) elemet a mostani tapasztalatom szerint baromi lassú... egyelőre nem találtam azt a módszert ami ne tűnne nagyon lassúnak.

    A másik, hogy intiben beállítom a sebességet (alapból is amúgy is 1 lenne gondolom)
    tts?.setSpeechRate(1f)
    de ennek ellenére az első néhány megszólalás sokszor nagyon hadarós. Aztán lelassít a beállított normál tempóra.

  • Kutyauto

    csendes tag

    //Mire az alábbit megírtam, megoldódott.... Rendesen futtatva azért nem ment mert el volt írva a bekérő sor. Debug ablakban meg úgy látszik nem lehet kiértékeltetni ezt a kifejezést....
    Sziasztok,
    Vajh mi az oka annak, hogy a getString(id) nekem semmilyen formában nem megy?
    Se a MainActivity onCreate -ben, se sehol máshol. Bárhol, bármilyen formában próbálom elérni, hibát ad vissza. A legkülönbözőbb elérésekkel, kontextekkel próbáltam. A string azonosítót feladja, aztán mégis az a hiba, hogy nem találja.
    Most két sztring resource fájlom van, de default és egy (en) változat, de gondolom nem ez lehet a baj.
    Órák óta szívok vele, amiket a neten találtam már próbáltam, de vagy nem is jött nekem elő a javasolt függvény, vagy ha mégis az is ugyanígy nem működött. Fragmentjeim is vannak.

    [ Szerkesztve ]

  • Kutyauto

    csendes tag

    Sziasztok,

    Első körben lassan elkészül a nagy mű. Utolsó lépésként integrálni szerettem volna bele egy Google AdMob banner formátumot. Elvileg sikerült is, fordul az egész.
    Regisztráltam az AdMob -on , felvettem teszt eszköznek a laptopon futó emulátort.
    Ettől függetlenül nem akartam a saját AdMob ID-mal tesztelni, hanem a https://admob-plus.github.io/docs/cordova/test-ads oldalon található
    ca-app-pub-3940256099942544/6300978111 ID-t tettem bele a Manifestbe és az Activitybe is. Sajna nem indul el, Invalid ID üzenetet kapok rá.
    Végül kipróbáltam a saját számommal is, de arra is ez jön. Az talán még amúgy sem aktív, mivel még nem töltöttem fel semmilyen app boltba a progit. Ezt reklámmal együtt való tesztelés után terveztem. Hogyan kéne ennek mennie?

  • Kutyauto

    csendes tag

    válasz sztanozs #5492 üzenetére

    Köszi. Átnéztem, de végül máshonnét lett jó.

    Én is és amennyire látom az általad adott linken kérdező valaki is úgy gondolom/gondoltam,
    hogy a Manifest és az XML fájlban ugyanannak az ID számnak kellene szerepelnie, de úgy sehogy nem működik nekem.

    A https://developers.google.com/admob/android/quick-start#import_the_mobile_ads_sdk leírás (továbbiak "leírás") alapján, a Manifest fájlban a szintén ott látható Sample AdMob app ID komment sorban megadott értékkel elindul a cucc és akkor jelenik meg hirdetés, ha a megjelenítő xml fálban a fene tudja már hol talált "/6499/example/banner" érték, vagy a leírásban a Banner típus implenetációjára tovább kattintva ott megadott "ca-app-pub-3940256099942544/6300978111" érték szerepel.
    Ha egyforma értéket írok akkor vagy el sem indul, vagy elindul de nem jelenik meg a banner.

    Szóval igazából most azt hiszem két külön szám kell. A Manifestbe az app id, az xml-be meg a formátumnak megfelelő fix érték. Majd most próbálom cseszegetni, kitalálni mikor és hogyan cserélődik a tartalom, meg megnézni mikor mi hívódik meg rajta.


  • Kutyauto

    csendes tag

    válasz Kutyauto #5493 üzenetére

    Bár megnézve ezt https://support.google.com/admob/answer/3016009?hl=en és ebből átkattintva ide https://support.google.com/admob/answer/7356431

    és utána ennek a harmadik pontjából
    https://developers.google.com/admob/android/quick-start
    átkattintva ide: https://support.google.com/admob/answer/7356431

    ...ugyanoda jutunk, tehát az első gondolatomnak kellett volna jónak lennie, a két érték egyforma volna... csak úgy nem működik. A tesztelésre feltalált értékek közül csak felemás párosítással működik valahogy...
    Megint megfájdult a fejem és belekavarodtam... :-/ pihi.

  • Kutyauto

    csendes tag

    válasz Kutyauto #5494 üzenetére

    Na közben ráakadtam erre a videóra: https://www.youtube.com/watch?v=rhiHNFkevgw
    Kihagytam pár lépést, így már világosabb a kép. : -)

  • Kutyauto

    csendes tag

    Sziasztok,

    No, elvileg készen vagyok egy alap változattal. Van itthon egy 2016 os kisebb felbontású Samsungom, azzal elvacakoltam mire azon is futottak és jól megjelentek a dolgok. Még memória korlátba is ütköztem, egyes funkciókat át kellett írnom. Bár elsősorban tanulási céllal csináltam ezt a konkrét játékot , azért nyilván hasznát is szívesen látnám ha van rá mód.
    A jelenlegi változat csak lokálisan működik, ergo ha nincs hálózat akkor reklám sem fut, de játszani azt lehet vele. Hogy lehet ebből legjobban kihozni a pontenciálisan benne lévő 10 dollárt? ;]
    Látom pl. , hogy a MobAds nem engedélyez Donate gombot meg ilyesmiket. Van-e olyan platform ahová fel lehet tenni Donate gombos, vagy másképp PayPalos fizetést lehetővé tevő verziót és a mobilok is hajlandók megbízhatóként telepíteni az onnan származó cuccot?
    Olvasgatok magam is ebben a témában, de ha van valakinek evvel kapcsolatban tapasztalata az érdekelne.

  • Kutyauto

    csendes tag

    Sziasztok
    A MainActivity-men van egy tabLayout aminek 3 lapja van.
    Mind a háromba egy -egy xml töltődik, a hozzájuk tartozó Class-ok Fragment() ből vannak.

    A második és harmadik lapok felépítése, betöltése teljesen megegyezik, csak a tartalma és a vezérlések kódja más.
    Ha az elsőről a második page-re átlépek, majd az elsőre vissza akárhányszor, az első onCreateView-ja sosem fut le újra.
    Ha az elsőről a harmadikra lépek át akár egy lépésben, vagy akár a másodikon keresztül, majd vissza az elsőre, akkor az első lap onCreateView-ja azonnal lefut újra.

    Nem találom a kódban semmi indokát ennek a különböző viselkedésnek, ahogy látom minden vonatkozó rész tök egyforma felépítésű. Lehet ennek valami befolyásolható oka amit nem látok, vagy véletlenszerű, hogy az időlegesen nem látható első oldalt mikor tölti újra rendszer? Meg tudom kérni valahogy ne csinálja?


  • Kutyauto

    csendes tag

    válasz Kutyauto #5497 üzenetére

    Az első lapon futó kód minden életciklus függvényét kiírattam és néztem a konzolon mi történik : átkattintok az elsőről a második oldalra, majd vissza.... Aztán az elsőről a harmadikra és vissza.

    Elsőnél csak az onPause, majd az onResume fut le. Másodiknál van még valami, ami kiváltja az oldal újratöltését is. Át kell írnom ezt az onCreateView-t, hogy mindenképp jó legyen.
    *******************************
    D/EGL_emulation: app_time_stats: avg=598.44ms min=10.23ms max=6666.20ms count=12

    I/System.out: TAB1 fragment onPause

    I/OpenGLRenderer: Davey! duration=766ms; Flags=0, FrameTimelineVsyncId=192136, IntendedVsync=38222434750298, Vsync=38222868083614, InputEventId=0, HandleInputStart=38222881628520, AnimationStart=38222881673120, PerformTraversalsStart=38222884529220, DrawStart=38223142900020, FrameDeadline=38222468083630, FrameInterval=38222881491520, FrameStartTime=16666666, SyncQueued=38223181721620, SyncStart=38223182247220, IssueDrawCommandsStart=38223183019820, SwapBuffers=38223197923120, FrameCompleted=38223201973620, DequeueBufferDuration=102100, QueueBufferDuration=2548500, GpuCompleted=38223201310720, SwapBuffersCompleted=38223201973620, DisplayPresentTime=8026311069216502372,
    D/EGL_emulation: app_time_stats: avg=17.82ms min=5.02ms max=217.56ms count=41
    D/EGL_emulation: app_time_stats: avg=772.65ms min=3.85ms max=4551.29ms count=6

    I/System.out: TAB1 fragment onResume
    *************************


    Aztán átkattintok az elsőről a harmadikra és vissza... Szintén a pause és a resume fut le , csak közben valamiért még belép a reklám blokk is.. de ha kiszedem az egész bannert, akkor is ugyanez van.
    ************************************
    I/System.out: TAB1 fragment onPause

    D/EGL_emulation: app_time_stats: avg=77.93ms min=3.00ms max=3133.50ms count=50
    D/DynamitePackage: Instantiating com.google.android.gms.ads.ChimeraAdManagerCreatorImpl
    I/Ads: This request is sent from a test device.
    W/ConnectionStatusConfig: Dynamic lookup for intent failed for action: com.google.android.gms.ads.service.START
    I/System.out: TAB1 fragment onResume

    Ez után viszont jön még egy rakás sor, ami az előzőnél szintén nem jött. talán a kiemelt résszel van baja, ami miatt aztán megjön az onCreateView is.

    I/Choreographer: Skipped 38 frames! The application may be doing too much work on its main thread.
    D/EGL_emulation: app_time_stats: avg=5.34ms min=2.11ms max=30.96ms count=52
    I/OpenGLRenderer: Davey! duration=941ms; Flags=0, FrameTimelineVsyncId=192481, IntendedVsync=38239284749624, Vsync=38239918082932, InputEventId=930823484, HandleInputStart=38239921690220, AnimationStart=38239921719020, .... és a többi
    *************************************************

  • Kutyauto

    csendes tag

    válasz BE4GLE #5499 üzenetére

    Üdv,
    Köszönöm, ez megoldotta! :R

    Amiket korábban írtál, azoknak is kezdem kapisgálni az értelmét...
    Megtapasztaltam mekkora szívás is pl. amikor egy nem classban, hanem primitív változóban tárolt adatot később mégis by reference akarnék passzolgatni (végül találtam rá megoldást),
    tovább addig, hogy mennyivel könnyebb is viewModelt, meg livedata-t használni , meg databindinget... meg stílusokat, meg még egy rakás dolgot amiket használni kell sokat mire az alapjaik készséggé válnak.
    Óceán van tudnivalókból. Ha kitart a lelkesedésem pár év múlva talán ügyes 60-as junior leszek :)

  • Kutyauto

    csendes tag

    Sziasztok,

    Felküzdöttem magam a Playbe , belső tesztelést csinálok egyelőre. Elég összetett dolog a megjelenés, sok mindent nem értek még belőle tisztán.
    Gondoltam csinálok egy funkciót, ami időnként lefut hogy az ember tudjon értékelést küldeni az applikációból. Az első tesztnél le is futott, de soha többet.
    Aztán olvastam valahol, hogy ha már adott az illető értékelést, akkor többé nem jön az ablak hiába hívogatod. Amúgy is csak központilag szabályozva, olykor olykor fog megjelenni a hívásra.
    Max új csomagnévvel megint feltöltve meg ilyesmi, de olyat nem akarnék, nem olyan egyszerű móka...
    Kár, hogy nem debuggoltam le elsőre, így most nem tudom miből lehetne tudni, hogy adott, vagy nem adott értékelést az ablakban, ha az megjelent. Mert akkor letárolnám és nem is hívogatnám többet ezt a funkciót.
    Ezt az alábbi kódot találtam és építettem be, de nem találok rá infót, hogy az akciót hogyan lehet megtudni :

    val reviewManager = ReviewManagerFactory.create(mycontext)
    reviewManager.requestReviewFlow()
    .addOnCompleteListener { task ->
    if (task.isSuccessful) {
    reviewManager.launchReviewFlow(mycontext as MainActivity, task.result)
    .addOnCompleteListener {
    // Continue the normal user flow.
    }
    }
    else {
    // Continue the normal user flow.
    }
    }

    Talán ha így hívnám meg:
    val result = manager.launchReviewFlow(currentActivity, task.getResult())..addOnCompleteListener {}
    Akkor a resultban talán lenne valami eredmény, de nem tudom mi lenne ott és most már kipróbálni sem tudom egyszerű módon...

  • Kutyauto

    csendes tag

    Sziasztok,

    Küzdök a publikálással. A legelső feltöltésemben nem talált piros hibát a Google Play, de pár kontraszt, meg efféle dolgokat kiírt. Erre letiltottam a sötét módot, nem volt kedvem vacakolni vele, meg még ezt azt módosítottam. Második feltöltésre , hozott egy hibát egyetlen eszközön, ami a szövegfelolvasás részben keletkezett. (amihez amúgy nem nyúltam)

    Itt a lokalizációnak megfelelő első hangot próbálom kiválasztani, amihez nem kell hálózati kapcsolat sem.

    var voice:Voice? = null
    voice = tts?.voices?.first {
    it.locale == clocale && !it.isNetworkConnectionRequired
    }
    if (voice != null) {
    tts?.setVoice(voice)
    }

    Erre jön ez a hiba, valahol a TextToSpeech motorban :
    java.util.NoSuchElementException: Collection contains no element matching the predicate.

    Erre az egészet betettem egy
    try{ }

    blokkba, gondolván hogy ha azon belül hiba jön, akkor az ignorálódik. De nem. Megmaradt a hiba .
    Elég tanácstalan vagyok, lassan haljok rá, hogy az egészet kihagyom aztán maradjon a defaulton :-/
    Amilyen okosnak és kukacosan precíznek tűnik a fordító, pont olyan nehézkesnek megfelelni a teszteken. Még valami egyedi natív crash is van egy fajta eszközön egy szimpla hangfájl lejátszásnál, de azzal még nem foglalkoztam. Kicsit lelomboz ez.

  • Kutyauto

    csendes tag

    válasz Kutyauto #5502 üzenetére

    A tts-t defaulton hagyom, nem tudok mit kezdeni vele. Közben rájöttem, hogy a médiával kapcsolatban probléma, hogy timereket használok, azokból indítok effekteket és ha az activityt kilövöm a timer alatt, akkor az hibát okoz, illetve már rég nincs fent az ablak, amikor a tiktakk még mindig megy. Ezeket megoldottam az onDestroy - okban, előbb kilövöm az esetlegesen futó timert.

  • Kutyauto

    csendes tag

    válasz Zsoxx #5504 üzenetére

    Köszi, nézem azt is, de még nem volt jó megoldás.

    Most végül ezt a formulát (amit amúgy egy csomó ideig keresgéltem):
    voice = tts?.voices?.first {
    it.locale == clocale && !it.isNetworkConnectionRequired
    }

    Kicseréltem egy szimpla mechanikus for ciklus - break megoldásra, aztán úgy néz ki így jó.

  • Kutyauto

    csendes tag

    Amúgy megfaragtam ezt a cuccot, működik, de látom hogy nem az lett volna a helyes technika,ahogy csináltam. Volt szó a coroutinokról, de csak alap szinten. Látom, hogy sokkal fontosabb használni és sokkal nagyobb téma. Néztem, hallgattam róla mélyebb anyagokat de gyenge az angolom. Sok próba, debug, tesztelés vár még rám mire megértem azt a sok mindent amiről szó volt ezekben az anyagokban. Ha esetleg valaki tud ingyenes, vagy nem drága magyar nyelvű anyagot erről a témáról azt megköszönném.

  • Kutyauto

    csendes tag

    válasz Zsoxx #5507 üzenetére

    Köszi, megnézem ezeket is.
    Átrágtam magam ezen : https://amitshekhar.me/blog/kotlin-coroutines és némileg úgy érzem világosodik a dolog. Annyira tán mégsem bonyolult ez, csak régen mintha jobb lett volna a felfogásom .
    Az Ekler Péter egy respektábilis személyiség, jók a tanfolyamai, semmi esélyem nem lett volna nélkülük elindulni ebben a dologban. Azonban amíg nem keresek ezzel pénzt (és elég valószínűtlennek tűnik, hogy valaha is fogok...), addig sajna nem tudok már költeni rá több papírnyi összegeket, még akkor sem, ha amúgy megérné az árát. Hobbiként már csakis olyan dolgokat csinálok amik nem kerülnek látható pénzbe. Régebben csináltam fából is dolgokat csak úgy szórakozásként is, de ma már azt is csak akkor csinálom meg ha vagy nekem kell, vagy van aki kifizeti a gépkopást, áramot, anyagokat, a ráfordított időt...hónapokig is csend van a műhelyben. Egyelőre marad az internet, meg a fordítgatás. :-/ . Azért így is szórakoztat, meg ott van a lottó faktor is... hátha valahogy mégis kisül belőle valami.

  • Kutyauto

    csendes tag

    Sziasztok,

    Sok helyről hallom, hogy a Jetpack Compose a jövő... Én egyelőre még az xml-es desingt is csak tanulgatom, de azért picit belenéztem pár bemutató videóba. Mindegyikben kézzel írogatnak a kódba megjelenítendő képernyő elemeket, meg hozzájuk paramétereket.
    Azok alapján amit eddig láttam egyelőre nem értem mi a királyság a Jetpack Compose-ban az Android Studio grafikus képernyő fejlesztői felületéhez képest. Én sem egyszerűbbnek , sem áttekintetőbbnek nem látom. Nem veszek észre valamit? Ti használjátok a Compose-t?

  • Kutyauto

    csendes tag

    válasz bandi0000 #5510 üzenetére

    Köszi. Épp volt egy webinárium beszélgetés ahol ezt feldobhattam volna, de sajna lemaradtam az élőről.
    Lesz még mód rá.

  • Kutyauto

    csendes tag

    válasz Zsoxx #5512 üzenetére

    Még nem. Most belenéztem, nagyon jónak látszik, majd holnap végig nézem egészet. Köszi a linket!

  • Kutyauto

    csendes tag

    válasz Kutyauto #5513 üzenetére

    Ebből kiderült, hogy kb. miért volna ez jó, bár a végeredmény szempontjából azt hiszem végül is mindegy melyik úton éred el ugyanazt a működést. Az is kiderült, hogy ez önmagában is megint egy jó nagy falat, viszont ha a világ erre megy, akkor hosszabb távon nem érdemes lemaradni róla. Azt hiszem egyelőre jobb, ha a hagyományos módszerben lévő gyakorlatot próbálom fejleszteni, aztán egy adott ponton apró lépésben hozzá próbálni ezt az újat.

  • Kutyauto

    csendes tag

    válasz Zsoxx #5522 üzenetére

    Lehet, nekem sincs vállalkozásom. Kértek bankszámlát, fényképes igazolványt, meg talán adókártyát.

  • Kutyauto

    csendes tag

    válasz Zsoxx #5530 üzenetére

    Sajnos nem emlékszem hogy volt akkor az űrlap amikor csináltam :F
    Nekem az igazolványokat kellett többször elküldenem, vagy mert apró becsillanás volt a fotón, vagy a felbontást kicsinyellték. (olvashatók voltak, gondolom automata dobta vissza) Lényegében majd egy hónap volt a fizetés után mire élni kezdett. Miket kötelező megadnod? Ha beírod a neved és a sima adóazonosító számodat, azt nem eszi?

  • Kutyauto

    csendes tag

    válasz Zsoxx #5532 üzenetére

    Igen, én is "Egyéni" vagyok. Sajnos nem tudok visszaemlékezni volt-e előttem ez az űrlap, szerintem nem.
    Mi van ha kiválasztod az Egyéni vállalkozót és tovább mégy?

  • Kutyauto

    csendes tag

    Sziasztok

    okhttp cuccal csinálom hogy tudjanak kommunikálni az appok egymással egy szerveren keresztül. Secure winsock a megoldás, az ugye teljesen aszinkron.
    A konnektnél azon vakarózom, hogy amikor rányom a konnektálásra és elmegy a request , akkor ugye az adott kiszolgáló vagy válaszol és akkor annak megfelelően a kliens WebsocketListenerjének az onMessage-ben kezelem a dolgot.
    De az is lehet, hogy nem válaszol egyáltalán mert mondjuk nem fut.
    Ilyenkor ugyanott az onFailure fut le. Ez nálam most ilyen...

    override fun onFailure(pwebSocket: WebSocket , t: Throwable, response: Response?) {
    //Log.d(TAG, "onFailure: ${t.message} $response")
    if (t.message?.startsWith("failed to connect to",true)==true) {
    if (webSocket?.pnAttempt!! < 3)
    {
    webSocket?.pnAttempt = webSocket?.pnAttempt!! +1
    webSocket?.ws_connect() // újra próbálkozik, a pnAttemptből látja hányadikszor
    }
    else
    {
    webSocket?.pnAttempt=1
    webSocket?.SocketViewModel?._socketStatus?.postValue(false)
    }
    }
    super.onFailure(pwebSocket, t, response)
    }

    Azt akarom belőle kihozni, hogy N próbálkozásig hívja újra és újra a konnektet. Ilyenkor a ws_connect -ben van lehetőség másik szervert választani egy listából, vagy ha elfogytak a lehetőségek, akkor vége és a státuszt Próbálkozásból Disconnectre állítom a képernyőn.

    Ez működik is, csak a kérdés: az onFailure response paramétere ilyenkor üres, a t: Throwable paraméter t.message tagjából tudom kitalálni, hogy konnekt hiba volt.
    (t.message?.startsWith("failed to connect to",true)==true)

    Nincs ez helyett a szöveg helyett valami egzaktabb hibakód valahol? Már mindent széttúrtam, de én nem találtam jobbat.

    Kicsit tartok tőle, hogy a szöveges érték esetleg megváltozik valamilyen környezetben és akkor elhasal.

    [ Szerkesztve ]

  • Kutyauto

    csendes tag

    válasz Zsoxx #5546 üzenetére

    Nem tudom, a Firebase nekem eddig teljesen kimaradt. A fejemben egy sima adatbázis szerverként élt, én pedig MySql -ben sok mindent csináltam nem akarnék mást használni.
    Lehet hogy érdemes volna.

  • Kutyauto

    csendes tag

    válasz bucihost #5548 üzenetére

    Gondolom akkor megreklamálod a dolgot... ? Szerintem ezeket automatán csinálják,
    az is lehet, hogy egyszerűen csak a leírást nem találja elég jónak épp valami új algoritmus és valójában köze nincs semmilyen linknek az egészhez, hiába írkál ilyesmit.
    Megérte egyébként fent lenni ? Elérted amit gondoltál letöltések számában, reklámban ilyesmiben?

Új hozzászólás Aktív témák