Vorgurakendused 2 prax 2 2012

Allikas: Lambda

See on vana 2012 aasta praktikumi arhiiv, mitte hetkel realiseerimiseks mõeldud ülesanne!

Teise praktikumi sisuks on googles hostitud serverirakendusega (google app engine) suhtleva androidi rakenduse tegemine. Tööl on kaks osa:

  • Esialgse Androidi rakenduse tegemine. Piisab Androidi emulaatori kasutamisest, ei pea installeerima mobiiltelefoni.
  • Google app engine all serverirakenduse tegemine ja Androidi rakenduse ühendamine serverirakendusega.

Olemas on ka 2011 aasta arhiiv.

Kui soovid teha neid rakendusi hoopis iOS jaoks, siis on see täiesti OK, lihtsalt arvesta, et sel juhul sa praktikumides probleemide korral tõenäoliselt abi ei saa ning pead ise hakkama saama. Kui sa oled varem iOS jaoks rakendusi teinud, siis saad ilmselt edukalt hakkama. iOS puhul tuleb Google app engine funktsionaalsust ikkagi kasutada.


Rakenduse funktsionaalsus

Sa võid realiseerimiseks valida ühe kahest järgmisest variandist:

  • Loengute reitimise rakendus. Eesmärgiks on teha androidi programm, mille kaudu anda hinne toimunud loengule. Hinded salvestatakse serverisse ja sealt saab neid igaüks vaadata. Selleks, et hinnete andmine oleks suhteliselt mugav, võiks olla võimalik serveris määrata ette loengute ajagraafik ja rakenduses peaks saama valida loengu, mis on ajagraafiku järgi parasjagu käimas või värskelt lõppenud. Loengule võiks peale hinde soovi korral saada ka lühikesi kommentaare lisada.
  • Eesti turismikaardi rakendus. Eesmärgiks on teha androidi programm, mis kasutab Google mapsi androidi rakendust (mitte veebiversiooni), kuvamaks kaardile Eesti huviväärsusi. Huviväärsuste andmebaasina saad kasutada õppejõu täiendustega reaalset visitestonia.com andmebaasi: kopeeri loengus või praksis mälupulgalt enda arvutisse. Baasis on ca 6000 objekti, rõhuv enamus neist suhteliselt vähehuvitavad, st neid võib ignoreerida. Vaata ideede saamiseks visitestonia.com kaarti kaarti ja õppejõu sightsmap.com projekti. Rakenduses oleks mõistlik cacheda andmeid Androidi enda andmebaasis ja kasutada serverit mingi piirkonna (näiteks kogu eesti) andmete allalaadimiseks Androidi cache.

Kuidas alustada

Androidi arenduse juhendid googlelt leiad siit lingilt.

Esimese asjana on sul kindlasti vaja installeerida Androidi arenduskeskkond ja saada käima minimaalne näiterakendus HelloWorld Androidi emulaatoris.

Põhikeerukus on seejuures arenduskeskkonna installatsioon. See on suhteliselt aeganõudev! Installida saad omaenda masinas, samuti on see võimalik IT maja arvutiklassides. Ametliku õpetuse leiad siit lingilt. Loe seda õpetust ja vaata kindlasti lisaks soovitusi järgmises peatükis.

Kui arenduskeskkond on käima saadud, siis HelloWorldi valmistegemiseks kasuta seda google õpetust. Seejärel tee läbi veel mõned siit listist.

Kaardi-näiterakenduse jaos tee läbi see google tutorial ja vaata lisaks mobiforge tutorialit. Allpool leiad juhiseid google maps key genereerimiseks ja muid tähelepanekuid kaardivärgi kasutamiseks androidis.

Kui Androidi emulaatori käima saad ja väike proovirakendus tehtud, pane järgmisena oma masinasse google app engine ning tee samuti paar proovi: sellest lähemalt allpool peatükkides.

Praktiline soovitus: tee algul ainult "lihtsaid" baasasju

Kõik see ülalkirjeldatud keskkondade ülesseadmine võtab hea hulk aega ja süvenemist!

Kui nüüd nii Androidi emulaator käib ja google app engine samuti, siis võta järmise asjana ette Androidi emulaatori ja oma app engine rakenduse sidepidamine. Hakatuseks lase Androidi emulaatoris oleval rakendusel küsida app engine rakendusest mingi staatiline string kahe numbriga ja ürita saavutada, et Androidi rakendus selle stringi kuvaks või siis paneks juba kaardile markeri stringis antud koordinaatidega. Kui see valmis, siis on tehnoloogiline keskkond põhimõtteliselt olemas ja saad jätkata funktsionaalsuse ja kellade ning viledega.

NB! Püüa esialgu teha kõike nii lihtsalt kui vähegi võimalik. Ära võta kohe ette suuri eesmärke. Mh ära esialgu üldse muretse autentimise, turvalisuse jms pärast. Peaasi on baasvärk käima saada, ja näiteks app enginest saadud staatilise dummydataga töötav ühte markerit kuvav rakendus on palju väärtuslikum asi, kui mahukas "funktsionaalsus", mis tegelikult ei tööta. Samuti ära hakka esialgu üritamagi Androidi rakenduses teha kasutajate haldamist, sisselogimist, päris mobiilile installi jne: tee kasutajate haldamine app engine veebisaidil, lükka moblasse installimine päris lõppu (ei ole ka üldse kohustuslik!) jne. Täiustusi jne tee alles siis, kui baasasjad käivad. Praksiülesanne ei ole teha korralik, turvatud ja mugav rakendus, vaid lihtsalt töötav prototüüp-baasfunktsionaalsus. Mis ei tähenda, et kõiki neid täiustusi ja korralikku värki ei tasuks teha: lihtsalt lükka nende tegemine aega, kui baasfunktsionaalsus käib.

Androidi arenduskeskkonna installeerimine

Installeerida saab kogu komplekti nii windowsi, linuxisse kui maci. Siin peatükis on märkmed windowsi jaoks.

Vaja on installida neli asja ja seejärel tekitada emulaator:

  • Java SE (vajalik on arendusversioon, JEE ei ole vajalik)
  • Androidi SDK
  • Eclipse (ei ole otseselt kohustuslik, kuid lihtsustab oluliselt)
  • Eclipse androidi developmendi plugin.

Installeerimise õpetuse leiad siit lingilt. Täiendavalt võib olla abiks see juhend, mis sisaldab Eclipse lisade/konfimise/emulaatori käivitamise ekraanipilte.

Nõuandeid ja tähelepanekuid

Allpool täiendavaid juhiseid, tähelepanekuid ja vajalikke fikse:

  • Java SE ja Eclipse on olemas nii 32 kui 64 bitisena. Mõlemad on OK, AGA mõlemad peavad olema sama bittide arvuga (kas 32 ja 32 või 64 ja 64).
  • Java SE downloadi leht (uusim versioon on OK, vanemad sobivad kuni mingi piirini)
  • Eclipse downloadi leht: kui sul juba Eclipse juhtumisi pole, siis võta eclipse classic.
  • Android SDK download. Täpsemalt:
    • Kui oled installeri alla tõmmanud, pane ta käima, hakkab ise tõmbama järgmisi tükke.
    • Peale esialgset tõmbamist saad suure menüü valikutega. Mida sealt võtta, seda vaata siit juhendist. Soovitused valikute osas:
      • Ülemised valikud jäta peale.
      • Valima hakkad blokist "SDK platform". Võta sealt kindlasti kõige suurema numbriga versioon (ntx 3.2) ja soovitavalt ka mõni uuem 2 seeria versioon (kui sul omal androidi mobla, võta selle versiooni variant). Teised keera maha: kliki, kuni rea ees tekib punane rist.
      • Seejärel vali "Samples" blokist need variandid, mis vastavad eelnevalt valitud platvormile (sama number). Teised keera jälle klikkides maha.
      • Seejärel vali "Google apis" blokist samuti ainult need, mis vastavad eelnevalt valitud versioonile (kliki kuni läheb roheliseks, teised kliki punaseks).
      • Vali ka "Usb driver"
      • Alumised valikud (Usb draiveri all, vaikimisi rohelised) jäta peale.
  • Eclipse ADT plugina install:
    • Algul tee, nagu viidatud juhend ütleb: ava Eclipses "Help > Install New Software....", siis pane avaneval vormil Name alla ADT Plugin ja sisesta selle all väljale täpselt selline url: https://dl-ssl.google.com/android/eclipse/ ja seejärel vajuta Add. Seejärel läheb veidi ootamist, kui info alla tõmmatakse, vaja on valida uus tekkiv rida, teha mitu nexti vajutust, accepti boxe jms (vt viidatud juhendit) ja lõpuks Eclipse restart.
    • Seejärel ütleb juhendi peatükk "Configuring the ADT Plugin", et Eclipses pead seadma eelnevalt laetud Android SDK asukoha. Ava Eclipse Window menüüst altäärest preferences ja avanevas aknas vali vasakul üleval Android. Pead seadma paremal väljal SDK location. Siin on mõned nüansid! 2011 aastal tuli teha järmisi asju, mille vajalikust 2012 aastal ei ole suutnud tuvastada. Seega, arvesta, et selline probleem ja lahendusvõimalused võivad olla vajalikud, aga 2012 aastal on probleem võib-olla lahendatud: kui sinu masinas on ADK asukoht C:\Program Files ... \android-sdk ja seal pathis on tühikud (Program Files sees ntx on) siis ei tohi sisestavas pathis olla tühikuid! Selle asemel sisesta C:\PROGRA~2\Android\android-sdk kus numbri 2 asemel proovi ka 1 (Eclipse kaebab, kui pathi ei leia). IT maja arvutiklassis sisesta väljale (tammet asemele pane oma nimi C:\Users all) aga C:\Users\tammet\AppData\local\Android\android-sdk ja seal pathis tühikuid tõenäoliselt ei ole.
    • Vajalik fix IT maja arvutiklassides:
      • 2012 aastal on arvutiklassides probleem kasutajakataloogiga: Android tahab kasutada sinu kataloogi C:\Users\kasutaja.nimi\.android kuid kõik Eclipse/androidi asjad lähevad ülesseadmisel kataloogiks \\intra.ttu.ee\home\kasutaja.nimi\.android . Hard linke samuti ei lubata panna. Üks töötav lahenduseks on lihtsalt kopeerida kataloog \\intra.ttu.ee\home\kasutaja.nimi\.android kataloogiks C:\Users\kasutaja.nimi\.android
      • 2011 aastal oli arvutiklassides teiststugune probleem kasutajakataloogiga: kasutaja kodukataloogi määrang on kasutajale C:\Users\proovija mida kasutada ei saa. Seetõttu ei õnnestu hoobilt Androidi emulaatorit tekitada. Sinu isiklikus masinas seda probleemi tõenäoliselt pole! IT majas pead tegema järgmist: ava rakendus registry editor (windowsi menüüst search programs and files boksis kirjuta regedit) ja seal navigeeri kohani "HKEY_CURRENT_USER" -> "Software" -> "Microsoft" -> "Windows" -> "Current Version" -> "Explorer" -> "Shell Folders" ja paremal akna osas sea muutuja "desktop" väärtuseks C:\Users\tammet\Desktop (tammet asemel pane oma nimi). Selle probleemi ja fiksi kohta leiab võrgust hulga infot, ntx siit.
  • Emulaatori tekitamiseks on HelloWorld tutorialis lühike peatükk "Create an AVD". Veidi pikemalt lahti seletades on protsess järgmine: mine Eclipse menüüs Window valikule "Android SDK and AVD manager" (see valik tekib, kui oled ADT plugina edukalt installerinud). Avaneb uus aken, kus paremal ülal kirjas "List of existing Android virtual devices ...". Vajuta "New", anna emulaatorile suvaline nimi. Kui teed kardiga rakendust, siis võta Target valikust "Google APIs ...N" (see on kaardiga versioon!) kus N on vastavalt mis varem installeerisid. Variandid "Android 2.2 ...", "Android 3.2 ..." on ilma kaardita. Pane SD kaardile mingi mõistlik väärtus, ntx 50. Lisaks on hea mõte on kasutada suhteliselt väiksema, igal juhul mitte maksimaalse resolutsiooniga variante: väiksema resoga varianti on oma ekraanil lihtsam vaadata, samuti näitab kogemus, et kõrge resolutsiooniga variandid võivad põhjustada AVD hangumist startupil. Muid asju sättima ei pea. Selle protsessi lõpuks peaks ilmuma tabelisse "List of existing Android Virtual Devices ..." rida uue emulaatoriga (AVD). Sellele saad nüüd klikata ja käivitamiseks vajutada "Start ...".
    • Kui emulaatorit ei teki, siis tõenäoliselt tekib Eclipse aknasse veateadete list. Nii või teisiti on kõige tõenäolisem veapõhjus mõne ülaltoodud fiksi tegematajätmine.
    • Emulaatori käivitamine. Kui lihtsalt emulaatori käima paned, siis ilmub värviline kena emulaatorirakendus, mis ütleb "android ..." ja midagi ei tee. Oota kannatlikult, minut või rohkem. Hulga aja pärast ilmub normaalne Androidi esileht, mida saab hiirega kasutada. Oma rakenduse käimapanekut on mõtet katsetada juba HelloWorld tutorialiga koos. Eclipses tehtud HelloWorld rakenduse paneb Eclipses proge käivitamine (üleval roheline nool Run) ise käima, pead lihtsalt jupp aega ootama. Samuti ilmub sinu rakendus Androidi rakenduste menüüsse emulaatoris.
  • Rakenduse mobiili laadimine. Vaata seda stackoverflow juhendit.

Google maps api key genereerimine

Kui sa praksis kaardivärgiga ei tegele, siis võid alltoodud juttu ignoreerida. Vastasel korral kindlasti loe!

Kaardivärgi kasutamiseks on vaja genereerida google mapsi api debugkey. Vaata hello-mapview tutorialit ja lisaks seda tutorialit ja arvesta seejuures järgmiste tähelepanekute/probleemidega:

  • Java keytool on sul tõenäoliselt pathil "c:\Program Files (x86)\Java\jre7\bin\keytool.exe" vms. Igaks juhuks kirjuta keytool täispathiga, muidu võid sattuda mõnda vale keytooli kasutama.
  • Java keytool võib produtseerida erinevat sorti keysid, õige on ainult MD5 variant! Pane keytoolile lisaargument -v näiteks nii: C:\Users\Tanel>"c:\Program Files (x86)\Java\jre7\bin\keytool.exe" -v -list -alias androiddebugkey -keystore C:\Users\Tanel\.android\debug.keystore -storepass android -keypass android
  • Selle -v argumendiga keytooli käivitamisel kopeeri väljundist fingerprint reast, mis algab MD5-ga, umbes selline: MD5: BE:C3:11:4E:...:BC:B4:96 (MD5: stringijuppi ära muidugi kaasa kopeeri)
  • Saadud fingerprint a la BE:C3:11:4E:...:BC:B4:96 kopeeri google lehel http://code.google.com/intl/et/android/maps-api-signup.html alla vormi
  • Kui kõik OK, siis saad google lehelt vastuseks midagi sellist "Täname teid, et registeerusite Android Maps rakendusliidese pääsukoodi saamiseks! Teie pääsukood on: 05VV1uAjD-uy4TpUwT... 0RomPQPC5sg"
  • Kui tekib ikkagi probleeme, siis võib mureks olla teie locale: on olemas teadaolev bugi, et mitte-US-English settingute korral võtmevärk ei pruugi käia. Selleks vaata soovitusi siit. adb programmi leiad umbes sellisest kohast: c:\Program Files (x86)\Android\android-sdk\platform-tools

Google app engine ülesseadmine

App engine arenduskeskkond (vt http://code.google.com/intl/et/appengine/ ) on tunduvalt lihtsam, kui Androidi arenduskeskkond.

Alltoodud õpetus on Pythoni jaoks Windowsil, kuid app engine lubab kasutada ka javat ja Go-d. Põhiasjad on neis keeltes ilmselt sarnased Pythonile, ilmselt ei ole suuri erinevusi ka Linuxi puhul. Väikese koormusega rakenduse puhul, nagu praksis teeme, ei ole vaja ka midagi maksta ja krediitkaarti ei küsita.

Sa võid kasutada nii Pythonit, Javat kui Go-d, aga õpetusi/soovitusi jagatakse praksis ainult Pythoni variandi jaoks, lihtsalt seepärast, et õppejõud kasutab Pythoni varianti.

Keskkonna ülesseadmisel on laias laastus neli sammu:

  • Tee endale Google app engine account ja loo uus, esialgu tühi rakendus googles.
  • Pane oma arvutisse Python 2.7 (vanem 2.5 on samuti variant)
  • Sea üles google app engine arendussüsteem.
  • Tee läbi tutoriali paar esimest punkti ja pane googles tööle hello world.

App engine account ja uue tühja rakenduse loomine app engines

Kui sul veel pole, tee kõigepealt google account (harilik gmail account). Sellest üksi app engine jaoks ei piisa. Mine App engine esilehelt paremal menüüs "Sign up for an App Engine account" lingile ja tee protseduur läbi. Mh pead sealjuures sisestama oma telefoninumbri ja sulle saadetakse kontroll-sms.

Lõpuks saad lehe "My Applications", kus all tühi list rakendusi. Selle all nupp "Create application". Vali oma rakenduse nimi a la prax23123 (see saab edaspidi olema siis prax23123.appspot.com). Nimed on globaalselt unikaalsed, pead otsima, kuni leiad seni kasutamata. Title võib ilmselt panna millise tahes. Muid settinguid ei ole vaja muuta, default on ok. Mh on "Open to all Google Accounts users (default)" ilmselt mõistlik sellisena jätta, autentimist saad oma rakenduses ikkagi vabalt kasutada.

Python 2.7

Enne app engine downloadi ja ülesseadmist pead ise panema masinasse Python 2.7 (see ei tule kaasa app engine süsteemiga). Otselink õigele lehele on http://www.python.org/getit/releases/ Võta sealt Python-2.7.3.msi ja installi masinasse (default settingutega saab ja on lihtne).


Katseta lõpuks windowsi käsurealt, et Python töötaks.


Google app engine sinu masinas

Lehelt http://code.google.com/intl/et/appengine/downloads.html#Google_App_Engine_SDK_for_Python leiad google_appengine_1.7.3.zip mis tuleb siis installida.

Sinu masinasse tekib rakendus "google app engine launcher" mille käivitamisel on näha tühi list rakendustest.

Tutorial ja hello world

Nüüd alusta tutorialiga (allpool pythoni variant) http://code.google.com/intl/et/appengine/docs/python/gettingstarted/introduction.html ja "continue to hello world".

App engine rakendusest File menüüst tee "Create New Application", seejuures application name pane täpselt seesama, mis enne google lehelt oma rakenduse identifikaatoriks valisid! Application Path tuleb võtta kataloog, mille alla tehakse automaatselt uus kataloog sinu rakenduse identifikaatoriga. Selle alla ehitab app engine automaatselt paar faili, mh main.py. Nüüd tekib sinu app engine rakenduse tabelisse automaatselt loodud helloworld rakendus, mille saad kohe valida ja käivitada.

Selle tulemusena hakkab sinu arvutis tööle väike server, millele saad ise brauseriga ligi ja saad kogu värki oma masinas arendada, laadides üles/uuendades juba töötavaid asju. Ligipääsuks mine http://localhost:8080 ja vaata, kas töötab. Seejärel muuda loodud main.py-d ja proovi uuesti.

Rakenduse üleslaadimiseks vajuta sinist "Deploy" nuppu, mispeale küsitakse sinu google emaili ja google passwordi ja laetakse värk üles: see võtab ca 10 sekundit vms, vahepeal näed konsoolilt, kuidas edeneb. Kui kõik ok, ava brauseris oma rakendus (a la prax23123.appspot.com) ja vaata, kas OK.

Google tutorial: edasised sammud

Rakenduses saad kasutada kas nö hariliku lihtsa cgi rakenduse põhimõtteid või veidi advancemat Pythoni wsgi süsteemi. Proovi tutorialist http://code.google.com/intl/et/appengine/docs/python/gettingstarted/introduction.html vasakust menüüst mõned sammud läbi teha, mh autentimise katse kasutaja google accounti vastu. Üldiselt on selleks vaja ainsa asjana muuta main.py faili.

Siin lingi all väike lisaarendus, mis täiendab vormide tutoriali autentimise osaga.

Veidi näitekoodi androidile

Esialgne väike katse kaardiga: kuvab kaks markerit (eri viisidel) fikseeritud asukohtadesse TTÜs ja ülemiste järve taga. Lisaks kuvab - suhteliselt rumalal ja kasutul viisil - väikese koordinaadiinfo akna, kasutades Toast widgetit. Teine katse lisab sellele koordinaadi lugemise võrgust üle http.

Järgnevas neli faili:

HelloGoogleMapsActivity.java, asub HelloGoogleMaps->src->com.example.hellogooglemaps kataloogis.

Pane mh tähele rida

Bitmap bmp = BitmapFactory.decodeResource( getResources(), R.drawable.map_marker);

mis eeldab, et kataloogis HelloGoogleMaps->res->drawable on fail map_marker.gif.

Põhisource variandid on järgnevad:

Eeldusi ja tähelepanekuid variant kahe jaoks siin kohal:

  • Loeb sisse ühe rea urlilt http://vorgurak2.appspot.com, hetkel annab viimane sisuks alati "59.437427 24.745052" mis on raekoja platsil.
  • Põhisources peab olema import java.net.*; ja import java.io.*;
  • Vigade avastamiseks/debugimiseks on olemas androidi monitorprogramm, mis näitab nii oma logi kui sinu kirjutatud logikirjeid:
    • lase masinas Android/android-sdk/tools all käima ddms.bat (see hakkab nüüd monitoorima emulaatorit)
    • pane oma source import android.util.Log;
    • pane oma source logikirjutamise käske, ntx "Log.i ("info","err reading from url");"
    • vaata monitoorimisrakenduse aknast alt tohutut logi ja püüa sealt oma kirjeid leida (nad on seal ja rohelist värvi!) või googelda õpetusi selle logi mugavamaks vaatamiseks ja filtreerimiseks, või vaata otse siit
  • Alternatiiv "ametlikule" logivariandile on kuvada pisemat debuginfot näiteks Toast widgeti abil, vt ülal viidatud näitekoodi.

Lisaks põhisourcele vaja sättida manifesti jms näiteks selliselt (järgnev töötas minu rakenduses OK):

AndroidManifest.xml, asub otse HelloGoogleMaps kataloogis:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.hellogooglemaps"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />
    <uses-library android:name="com.google.android.maps" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <uses-library android:name="com.google.android.maps" />
        <activity android:name=".HelloGoogleMapsActivity"
                  android:label="@string/app_name"
                  android:theme="@android:style/Theme.NoTitleBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
    </application>
</manifest>

main.xml, asub HelloGoogleMaps->res kataloogis.

Pane tähele rida android:apiKey="05VV1uAjD-uy4TpUwTkdW1GC3ZUz0RomPQPC5sg", siin peaks olema siis sinu enda maps api key.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent">
	<com.google.android.maps.MapView
	    xmlns:android="http://schemas.android.com/apk/res/android"
	    android:id="@+id/mapview"
	    android:layout_width="fill_parent"
	    android:layout_height="fill_parent"
	    android:clickable="true"
	    android:apiKey="05VV1uAjD-uy4TpUwTkdW1GC3ZUz0RomPQPC5sg"
	/>
    <LinearLayout android:id="@+id/zoom" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true" 
        android:layout_centerHorizontal="true" 
    />
</RelativeLayout> 

Neljas fail on map_marker.gif suurusega 33x33 pikselit (suuruse/punkti järgi on põhiproges seatud pikselinihe) mis on kataloogis HelloGoogleMaps->res->drawable . Võrgust leiad näiteks http://www.law4community.org.au/images/google_map_marker.gif