You are on page 1of 10

CASEmobile - MOBILNE RAZVOJNE TEHNOLOGIJE I RJEENJA 107

RAZVOJ APLIKACIJA ZA ANDROID PLATFORMU

DEVELOPMENT OF ANDROID MOBILE APPLICATIONS

Ognjen Ribii, mag.inf. Boris Toma, mag.inf. Zlatko Stapi

SAETAK:
Dananji trendovi u razvoju mobilnih aplikacija odraz su velike dinamike na tritu mobilnih ureaja. Ovaj rad se temelji na
predstavljanju osnovnih koncepata i naina razmiljanja kod razvoja aplikacija za Android mobilnu platformu. Nastoji se
ukazati na jednostavnost koritenja platforme kao i na standardni stil i pristup pisanja kvalitetnog programskog kda. U
radu su prikazane dobre prakse koritenja osnovnih i naprednijih koncepata u razvoju, ukljuujui i rad sa razvojnim
okruenjem kao i specifinosti Java jezika. U konanici, temeljem iskustva autora, rad prikazuje i najee probleme s
kojima se susreu razvojni inenjeri te naine njihovog rjeavanja.

ABSTRACT:
Current trends in mobile applications software development are results of significant dynamics in mobile device market.
This paper aims to introduce the basic concepts and ways of thinking regarding application development for the Android
mobile platform. This work tries to point out a simple use of the platform as well as a standard style and an approach in
defining a good programming code. Good practices are shown regarding the use of basic and advanced development
concepts in Java language. Paper also states a few guidelines regarding the usage of integrated development
environment. At the end, based on the authors experiences, few and common issues and problems for developers are
identified and their solution is presented.

1. UVOD prije navedeno treba shvatiti kao prijedlog, te


zainteresirane ne bi trebalo demoralizirati i odvratiti od
Android je od prve inaice iz 2008. godine [1] do danas itanja istog.
daleko napredovao kao skup softverskih alata koji
ukljuuju operacijski sustav, sustav zajednikih funkcija
(engl. middleware) i aplikacija. Mobilni ureaji postali su
2. STRUKTURA APLIKACIJA
bri, SDK sofisticiraniji, a korisnici zahtjevniji. Indikator Kako je prije navedeno aplikacije se piu u programskom
prije navedenog je nagli porast popularnosti platforme od jeziku Java. Jezik kao takav ima neke svoje specifinosti
strane korisnika, kao i programera od njezine publikacije. koje svakako prije samog poetka prouavanja izrade
Sama platforma je otvorenog kda (engl. open source) Android aplikacija valja pogledati, pa ak i prouiti.
to omoguava razvoj bogatih i naprednih aplikacija u Razvojna okolina se sastoji od seta razvojnih alata (engl.
relativno kratkom vremenu uz nerijetko besplatnu SDK tools), koji slue za prevoenje (engl. compile)
podrku zajednice. Ta razvojna zajednica je takoer izvornog kda Android aplikacije, pripreme aplikacija
opsena, te omoguava putem grupa, poput Google (engl. deployment) kako bi se one mogle izvravati na
Groups, komunikaciju s istom. Kao i svaka platforma, mobilnom ureaju.
Android sadri neke specifinosti.
Sve podatke o aplikaciji, ukljuujui izvrni kd, resurse
Ovaj rad se temelji na predstavljanju osnovnih potrebne za izvravanje aplikacije, metapodatke i
koncepata i naina razmiljanja kod razvoja aplikacija za manifest podatke o aplikaciji, razvojno okruenje kod
Android mobilnu platformu. Nastoji se ukazati na finaliziranja aplikacije pohranjuje u obliku jedne arhive sa
jednostavnost koritenja platforme kao i na standardni ekstenzijom .apk [3].
stil i pristup pisanja programskog kda. U radu su
prikazane dobre prakse koritenja osnovnih i naprednijih Prilikom instalacije aplikacije na mobilnom ureaju, ista
koncepata u razvoju, ukljuujui i rad sa razvojnim dobiva svog vlastitog korisnika odnosno jedinstveno
okruenjem kao i specifinosti Java jezika. U konanici, korisniko okruenje na Android platformi; takoer
temeljem iskustva autora, rad prikazuje i najee aplikaciji se dodjeljuje vlastito virtualno okruenje (engl.
probleme s kojima se susreu razvojni inenjeri te virtual machine) te vlastiti Linux ID [3]. Pri pokretanju,
naine njihovog rjeavanja. svakoj aplikaciji se dodjeljuje vlastiti proces unutar kojeg
se aplikacija izvrava, ovaj mehanizam titi Android
Veina prikazanih koncepata u radu je prikazana i platformu od neispravnih aplikacija tako da aplikacija
odgovarajuim primjerima koji prikazuju osnovu primjene moe utjecati samo na svoj proces dok su ostali procesi
koncepta o kojem se diskutira. Veina predloaka za izolirani od moebitnog tetnog procesa. Na ovaj nain
izradu primjera je preuzeta iz projekta Remoter koji su Andorid implementira princip dodjele minimalnih
autori razvili prije pisanja ovog rada i koji je trenutno u privilegija (engl. principle of least privilege) ime
fazi objave na Android trite. osigurava visoku sigurnost okruenja u kojima aplikacije
Ovaj rad bi trebali itati programeri koji su upoznati i ne mogu pristupati dijelovima sustava za koji nemaju
imaju iskustva sa Java programskim jezikom. Svakako dozvolu [3].
108 CASEmobile - MOBILNE RAZVOJNE TEHNOLOGIJE I RJEENJA

2.1 Aplikacijske komponente 2.4 Forme i raspored elemenata


Aplikacijske komponente su na Android platformi Za razliku od C-srodnih jezika kao to su C# ili
najvaniji elementi od kojih se sastoje aplikacije. Objective-C koji se koriste u Windows Phone odnosno
Svaka komponenta ima svoj ivotni ciklus, te na iPhone platformi, i koji omoguavaju crtanje formi,
omoguava sustavu rad s aplikacijom na sebi Android platforma preferira kdiranje dizajna formi.
Najee se radi sa XML datotekama koje sadre
svojstven nain. Postoje etiri osnovne komponente vizualni kd forme, pomalo nalik na HTML, no mogue je
[3]:
iste i napraviti programski, to dakako oduzima dosta
 Aktivnost (eng. Activity) Najee koritena vremena i nije preporuljivo. Sukladno tome postoje
komponenta u aplikacijama, reprezentira ekran komponente pregleda kontrola (engl. ViewGroup
odnosno suelje za korisniku interakciju. components), vrste razmjetaja elemenata unutar
 Servis (eng. Service) Operacija koja se izvrava u zaslona kao to su LinearLayout, RelativeLyout, i tako
pozadini, te se obino koristi za neke vremenski dalje. Isto tako, postoje pogledi (engl. view) odnosno
odnosno procesorski zahtjevne proraune. Service elementi koje prikazujemo. Koncept rada XML datoteka
je u stanju pokrenuti vlastiti proces te ostvariti sa dizajnom temelji se na hijerarhiji. ViewGroup unutar
interakciju s istim. sebe moe sadravati elemente forme: View ali i druge
 Pruatelj sadraha (eng.Content provider) Dio naine prikaza ViewGroup [9].
API-a koji omoguava rad sa zajednikim podacima
kao to su interna i eksterna memorija ili SQLite
baza. <?xml version="1.0" encoding="utf-8"?>
 Primatelj vanjskih dogaaja (eng. Broadcast <LinearLayout
receiver) Slui za primanje poruka iz sustava, na xmlns:android=
primjer gaenje ekrana, stiavanje glasnoe ureaja
i ostali dogaaji. "http://schemas.android.com/apk/res/android"
android:orientation="vertical"
2.2 Predefinirane varijable, resursi android:layout_width="fill_parent"
android:layout_height="fill_parent" >
Android za razliku od ostalih sustava ima vrlo dobro <Button
rijeen problem internih resursa. Na primjer, svi elementi android:id="@+id/btn"
forme se dohvaaju putem jedinstvenih identifikatora android:layout_width="wrap_content"
(engl. ID) ili oznaka (engl. tag). Ukoliko koristimo android:layout_height="wrap_content"
dohvaanje putem identifikatora, postupak pretraivanja android:text="Klik" />
elemenata je veoma brz sobzirom da istog reprezentira </LinearLayout>
cjelobrojna (engl. integer) varijabla. Takoer spremanje
preddefiniranih konstanti je omogueno na slian nain Kd 2 Jednostavna forma (XML)
kao i prije navedeni elementi forme.
Kd prikazan u isjeku (Kd 2) e rezultirati
2.3 Asinkrone poruke
jednostavnom formom koja sadri jednu tipku (engl.
Tri od etiri aplikacijske komponente aktiviraju se Button).
asinkronim porukama, intentima. To su Activity, Klasa koja procesira formu je prikazana u isjeku (Kd
Service i Broadcast reciver. Intent omoguava 3). Kd te klase je odgovoran za korisniki klik na tipku
pozivanje i povezivanje istih na izvrno okruenje (engl. definiranu prije navedenim XML kdom. Ukoliko se
runtime environment). Dakle, ako elimo pozvati novu klikne na tipku, ispie se preko brze obavijesti (engl.
formu, sve to trebamo napraviti jest stvoriti novi intent toast notification) tekst Ovo je test.
objekt, i kroz konstruktor objekta proslijediti klasu koja e
se pokrenuti. Rezultat akcije je, na primjer pri kreiranju public class HelloAndroid extends Activity
nove forme, novi zaslon odnosno forma koju smo kreirali {
i pozvali. /* Called when the activity is first
created. */
Intent myIntent = @Override
new Intent(getBaseContext(), public void onCreate(Bundle
frmMain.class); savedInstanceState) {
startActivity(myIntent); super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Kd 1 Primjer pozivanja/stvaranja forme (klase)
//Trazenje gumba unutar forme
Stoga, pozivanje aplikacijskih komponenata i ako je to final Button btn =
(Button)findViewById(R.id.btn)
potrebno slanje podataka istima je prvi bitan koncept na
koji emo se osvrnuti u ovom radu. Ukoliko elimo
//Postavljanje slusatelja
poslati odreene podatke novoj formi, dodajemo paket ili
button.setOnClickListener(
sveanj (engl. bundle) na intent. Spomenuti sveanj
new OnClickListener()
sadri skup podataka koje elimo poslati. Takoer kada
{ public void onClick(View v)
se stvori nova forma iste podatke dohvaamo putem
{ Toast.makeText(
getera iz intenta te ih po potrebi koristimo na novoj
HelloAndroid.this, "Ovo je test",
formi. Intenti zajedno sa aplikacijskim komponentama, Toast.LENGTH_SHORT).show();}});
Manifest datotekom i formama ine osnove }
programiranja u Android okruenju. }

Kd 3 Jednostavna klasa (Java)


CASEmobile - MOBILNE RAZVOJNE TEHNOLOGIJE I RJEENJA 109

2.5 Manifest datoteka


Manifest je XML datoteka koja je sastavni dio .apk arhive final Button btn = (Button)
i ima specifinu namjenu. Datoteka u potpunosti opisuje findViewById(R.id.btn);
btn.setOnClickListener(
aplikaciju. Sve aktivnosti, a i ostale komponente, su
opisane u datoteci na nain da sustav razumije namjenu, new OnClickListener()
korisnike dozvole i slino. Mogue je i ograniiti { public void onClick(View v)
aplikaciju na verziju platforme obzirom da novije verzije { Toast.makeText(
donose sa sobom i razliite funkcionalnosti [5]. HelloAndroid.this,
"Ovo je test", Toast.LENGTH_SHORT).show();
Primjer jedne takve datoteke prikazuje isjeak
programskog koda (Kd 4) }});
Kd 5 Primjer oslukivaa dogaaja
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk 3.2 Izbornici
/res/android"
package="app.test.example" Specifinost Android okruenja je neposredna interakcija
android:versionCode="1" programera i razvojnog okruenja pri kreiranju izgleda
android:versionName="1.0"> formi, izbornika, animacija i ostalih preteno XML
<uses-sdk android:minSdkVersion="5" /> baziranih rjeenja. Kao i forme, izbornike (engl. menu) je
<application mogue napraviti programski, ali ipak, kako je praksa pri
android:label="@string/app_name"> izradi aplikacija koritenje XML datoteka, taj pristup
<activity android:name=".Test" emo koristiti i kod izrade izbornika. Izbornik je u
pojedinim elementima slian klasinoj formi korisnikog
android:label="@string/app_name"> suelja, no ujedno ima i znatna pojednostavljenja ovog
<intent-filter> koncepta. Takoer hijerarhija elemenata kod izbornika
<action android:name= slina je hijerarhiji elemenata formi.
"android.intent.action.MAIN" />
<category android:name= <?xml version="1.0" encoding="utf-8"?>
"android.intent. category.LAUNCHER" <menu xmlns:android="http://schemas.android.
/> com/apk/res/android">
</intent-filter> <item android:id="@+id/settings"
</activity>
</application> android:title="@string/settings"/>
</manifest> </menu>

Kd 4 Primjer AndriodManifest datoteke (XML) Kd 6 Definicija izbornika (XML) Menu.xml datoteka


3.3 Obavijesti

3. OSNOVNI KONCEPTI U Android okruenju postoje tri razliite vrste


elemenata za prikaz obavijesti korisniku:
U ovom poglavlju pokuat emo pribliiti neke
 Brza obavijest
specifinosti programiranja u Android okruenju. Bavit
 Obavijest u statusnoj traci
emo se najeim konceptima koji se pojavljuju prilikom
 Obavijest na dijalokom okviru (engl. dialog
izrade aplikacija kao to su oslukivai dogaaja (engl.
notification)
event listeners), izbornici, obavijesti i ostali.
@Override
3.1 Oslukivai dogaaja public boolean onCreateOptionsMenu(Menu menu)
{
Oslukiva dogaaja je koncept Android platforme koji
MenuInflater inflater =
nam omoguava reagiranje na dogaaje kada se getMenuInflater();
dogode, te po potrebi i obraivanje istih. Koncept se inflater.inflate(R.menu.menu, menu);
temelji na povezivanju oslukivaa na dogaaj nekog od return true;
prethodno navedenih elemenata te time i na izmijeni }
izvravanja njegove funkcionalnosti. Takoer potrebno je @Override
spomenuti kako je mogue koristiti Java koncept koji public boolean onOptionsItemSelected(MenuItem
omoguava premoivanje standardnih metoda item){
izvravanja funkcionalnosti i zamjensko koritenje switch (item.getItemId())
vlastitih metoda. Koncept premoivanja se kao i u {
nekim drugim jezicima implementira koritenjem case R.id.settings:
predefinirane naredbe @Override, a zanimljivo je return true;
spomenuti da se u Android razvojnom okruenju moe default:
premostiti sve metode definirane na razini sustava. return super.onOptionsItemSelected(item);
Slian je pristup implementaciji funkcionalnosti pri }
reakciji na ostale napredne dogaaje kao to su na }
primjer dogaaj dodira (engl. touch event) ili dogaaj Kd 7 Zavravanje definicije izbornika (Java)
geste (engl. gesture event), no o tome u sljedeim
poglavljima. Brza obavijest (engl. toast notification) je privremeni
objekt koji slui za trenutno obavjetavanje korisnika.
Zauzima prostor koji mu je potreban da ispie poruku,
dok aplikacija i dalje ostaje vidljiva i interaktivna [9].
110 CASEmobile - MOBILNE RAZVOJNE TEHNOLOGIJE I RJEENJA

Obavijest u statusnoj traci (engl. status bar notification) 4.2 Dijeljena svojstva
oznaava trajniji tip notifikacije korisnika. Prikazuje se,
kako ime govori, u statusnoj traci, te pri selekciji okida Kako iz imena zakljuujemo radi se o zajednikim
intent definiran u obavijesti [9]. postavkama aplikacije (engl. shared preference).
Mogua je promjena primitivnih tipova podataka u obliku
final CharSequence[] items = klju => vrijednost. Takoer Activity ima indirektnu pod-
{getString(R.string.add), klasu PreferenceActivity koja nam omoguava pregled
postavki, sa preddefiniranom funkcionalnou,
getString(R.string.connect)}; spremljenom unutar odreene XML datoteke ili unutar
final AlertDialog.Builder options = klase koja koristi PreferenceActivity. Spomenuta klasa
automatski omoguava izmjene nad prije navedenim
new AlertDialog.Builder(this);
primitivnim podacima [5].
options.setTitle(getString(R.string.quick_act
ions)); final EditText name = (EditText)
options.setCancelable(true); findViewById(
R.id.text_name);
options.setItems(items, new SharedPreferences prefs =
DialogInterface.OnClickListener() PreferenceManager.getDefaultSharedPreferences
{ (
public void onClick(DialogInterface this);
dialog, int item) name.setText(prefs.getString("name",
{ //kod koji se izvrava prilikom "vrijednost"));
poziva }
});
Kd 10 Koritenje koncepta dijeljenih svojstava
options.show(); //aktiviranje dijaloga
Kd 8 Definiranje dijaloga 4.3 Unutarnja memorija
Obavijest na dijalokom okviru (engl. dialog notification) Unutarnja memorija omoguava spremanje podataka
je definirana kao novi mali dijaloki okvir koji se prikazuje aplikacija u internu memoriju ureaja. Uz razne dodatne
na vrh trenutnog dijalokog okvira, te moe pruati API-je omogueno nam je manipuliranje nad raznim
interakciju korisniku. Mogue ga je koristiti i za unos tipovima datoteka. Valja napomenuti kako se ova vrsta
malih koliina podataka [9]. Dijalog se stvara i prikazuje pohrane podataka koristi za spremanje privatnih
na nain kako je to navedeno ovim programskim podataka koji ne bi trebali biti dostupni ostalim
isjekom: aplikacijama ili korisniku [5]. U sljedeem programskom
isjeku se moe vidjeti nain pohrane podataka u
4. NAPREDNI KONCEPTI datoteku u unutarnjoj memoriji Android ureaja.
String FILENAME = "file";
Tijekom koritenja naprednih koncepata u razvoju
String string = "test";
aplikacija za Android ureaje, esto se sluimo svim
FileOutputStream fos = openFileOutput(FILENAME,
navedenim osnovnim konceptima kako bi se zadovoljila
funkcionalnost odreene komponente i postigla eljena Context.MODE_PRIVATE);
nova funkcionalnost. Budui da SDK nudi mnotvo fos.write(string.getBytes());
razliitih koncepata, ovaj rad opisuje prema naem fos.close();
izboru najee i najkoritenije koncepte. Kd 11 Koritenje unutarnje memorije

4.1 Prilagodnici 4.4 Vanjska memorija

Jedan od tih koncepata su prilagodnici (engl. adapters). Gotovo uvijek pri ovom pojmu mislimo na SD
Adapteri su koncepti koji omoguavaju izmjenu, to jest memorijske kartice. Temeljna razlika izmeu unutarnje i
prilagodbu odreene skupine podataka na neki od vanjske memorije je u dostupnosti podataka. Naime
predefiniranih naina. Primjer takve prilagodbe je Andorid, kako je prije navedeno, definira vie razina
SimpleAdapter. sigurnosti podataka, a podaci zapisani na ovaj nain
postaju dostupni svim aplikacijama pa ak i korisniku to
Ako primjerice koristimo listu za izbor jedne od
postaje sutina postojanja ovakve funkcionalnosti [5].
ponuenih vrijednosti, a stavke te liste su izvedene iz
skupa jednostavnijih atributa, iste moemo putem prije File path = getExternalStorageDirectory();
navedenog adaptera prilagoditi, te umetnuti u listu kao if (path != null) {
njene vrijednosti. Postoji mnotvo razliitih adaptera, File file = new File(path, "file");
ime se jo jednom pribliavamo shvaanju opsenosti OutputStream os = new
Android razvojnog okruenja kao i njegovih mogunosti. FileOutputStream(file);
os.write(new byte["test"]);}
ArrayList<Map<String, String>> server_lst
=list_values; Kd 12 Koritenje vanjske memorije
String[] from = {"name", "version"};
int[] to = {R.id.name, R.id.version}; 4.5 Mobilna baza podatka
SimpleAdapter adapter = new
SimpleAdapter(getApplicationContext(), list,
Jedan od dakako standardnih, ali i primamljivih
koncepata mobilnih ureaja je funkcionalnost koritenja
R.layout.list, from, to); mobilne baze podataka. Android okruenje rabi sqlite3
list.setAdapter(adapter); verziju baza podataka, te postoji mnotvo primjera kako
spomenutu bazu koristiti. Potrebno je naglasiti kako je
Kd 9 Koritenje adaptera pisanje pomone (engl. helper) klase, koja e umjesto
CASEmobile - MOBILNE RAZVOJNE TEHNOLOGIJE I RJEENJA 111

nas odraivati obradu upita, to na veim projektima klasi putem koje iste obraujemo. Specifinost ove
moe skratiti vrijeme izrade [5]. podrke je u praktiki neogranienosti primjene ovih
gesti. Dakako koritenje istih je dosta olakano putem
public class DBHelper extends
SQLiteOpenHelper
Gesture API-ja. Geste trebaju svoju vlastitu oslukivaku
{
klasu kao na primjer TrackpadGestureListner klasa
private static final int DATABASE_VERSION koja implementira dva suelja (engl. interface):
= 2;  OnGestureListener
private static final String DATABASE_NAME  OnDoubleTapListener
=
"sqlite_db"; DocumentBuilder builder =
DictionaryOpenHelper(Context context) { factory.newDocumentBuilder();
super(context, DATABASE_NAME, null, FileInputStream fin =
openFileInput(file_name);
DATABASE_VERSION);
Document dom = builder.parse(fin);
}

NodeList servers_from_xml =
@Override
public void onCreate(SQLiteDatabase db) {
dom.getElementsByTagName("some_elem");
db.execSQL("some SQL query");
}
for (i=0; i < servers_from_xml.getLength();
}
i++)
Kd 13 Koritenje SQLite baze podataka {
Node node = servers_from_xml.item(i);
4.6 HTTP
String name =
Kao pametni telefon tree i etvrte generacije -
node.getAttributes().item(0).getNodeValue().
generacije mobilnog Interneta, Android prua opseni
toString();
API za komunikaciju sa Internetom. Pokrivena je
}
cjelokupna funkcionalnost HTTP protokola, to ukljuuje
i mogunosti koritenja raznih web servisa na razini GET
i POST metoda. Kd 15 itanje podataka iz XML datoteke

URL connectURL = new URL("www.google.com"); Sama klasa sadri sljedee dogaaje:


HttpURLConnection http =
 onDown
(HttpURLConnection)connectURL.openConnection(  onFling
);  onLongPress
 onScroll
http.setDoInput(true);  onShowPress
http.setDoOutput(true);  onSingleTapUp
http.setUseCaches(false);  onDoubleTap
http.setRequestMethod("GET");  onDoubleTapEvent
 onSingleTapConfirmed
http.connect();//spajanje na posluitelj
http.getOutputStream().flush();
4.9 Grafika
Kompletno Android suelje i komponente su u sutini 2D
String response = getResponse(http);
grafike - svi elementi su 2D elementi. Transformacije
ovih elemenata svode se na manipuliranje irinom i
Kd 14 Primjer jednostavnog dohvaanja sadraja web visinom. Takoer mogue je animirati elemente, no o
stranice tome u sljedeim poglavljima [6].
Isjeak Kd 14 dohvaa sadraj web stranice Uz 2D podrane su 3D animacije i to na dva naina:
www.google.com koristei standardni HTTP protokol sa OpenGL i Renderscript animacije. OpenGL je ope
GET metodom. poznat koncept 3D animacija te je dovoljno rei kako
razvojno okruenje podrava est standardiziranih
4.7 XML verzija istoga. Dakle radi se o klasinoj manipulaciji kroz
API suelje. Za razliku od OpenGL-a, Renderscript
Kako se do sada moglo zakljuiti, platforma je koristi najbolji resurs za obradu grafike u konkretnom
orijentirana ka koritenju XML standarda, to nas moe trenutku, to ak moe biti i GPU (engl. Graphic
dovesti do zakljuka kako ista sadri i jaki XML API. Processing Unit) ukoliko ga ureaj ima.
Android prua podrku za DOM, SAX i Pull parser
koncepte. Od verzije 2.2 Android API je proiren s Takoer, Renderscript se razlikuje po jo nekim
xPath1.0 funkcionalnou za navigaciju XML karakteristikama od standardnog programiranja u
dokumentom. Androidu. Naime, isti je namijenjen korisnicima kojima
nije problem programirati u C-u, tonije C99 standardu
4.8 Gesture to za sobom moe povesti i probleme. Naime, budui je
mogue renderiranje na GPU-u, ispravljanje pogreaka
Dodavanjem Multi-Touch funkcionalnosti, Android (engl. debugging) moe postati problematian. Predlae
dobiva podrku za geste. Geste su interakcije sa se koritenje ove metode obrade animacije ukoliko je
ureajem prstima u vidu dodira (engl. tap), dvostrukog naglasak na performansama to jest gdje OpenGL ne
dodira (engl. double tap), pribliavanja prstima (engl. rezultira dovoljno kvalitetnim i brzim programskim kodom
pinch zoom), pomaka (engl. swipe), i tako dalje. [6].
Kreiranjem oslukivaa, predajemo dogaaj gesture
112 CASEmobile - MOBILNE RAZVOJNE TEHNOLOGIJE I RJEENJA

<?xml version="1.0" encoding="utf-8"?> Ovisno o traenoj funkcionalnost potrebno je dozvoliti


<set xmlns:android= koritenje odgovarajue infrastrukture unutar manifest
datoteke. Koriteni objekti u primjerima postoje ukoliko
"http://schemas.android.com/apk/res/android"> postoji traena infrastruktura na mobilnom ureaju, u
<translate android:fromXDelta="100%p" suprotnom vrijednost objekta je null.
android:toXDelta="0%p"
android:duration="500" /> 4.11 Google APIs
<alpha android:fromAlpha="0.0"
android:toAlpha="1.0" Podrka za rad s Google vanjskim API-jima unutar
android:duration="500" /> vlastitog mobilnog operacijskog sustava je i za oekivati.
</set>
Tako je na primjer koritenje Google Maps servisa
Kd 16 Definiranje animacije (XML) mogue ugraditi u aplikaciju, odabirom odgovarajueg
API-a prilikom stvaranja novog projekta.
Android takoer podrava 2D animacije koje se mogu Koncept Google Maps API-ja je drukije prirode zbog
provoditi nad elementima forme. Sastoje se od toga to se koristi na relativno jednostavan nain, ali
deklarativne XML datoteke ili programskog kda, te dodatne kontrole na Google kartu dodatno komplicira
programskog kda za obradu odnosno izvravanje 2D implementaciju [4].
animacija [6]. < com.google.android.maps.MapView
Isjeak Kd 16 prikazuje jednostavnu animaciju te android:id="@+id/mapView"
ukazuje na opsenost i snagu Android platforme prilikom android:layout_width="fill_parent"
rada sa grafikom odnosno 2D animacijama [6]. android:layout_height="fill_parent"
android:enabled="true"
final Animation a = android:clickable="true"
AnimationUtils.loadAnimation(Trackpad.this, android:apiKey="some api key"/>
R.anim.anim_xml);
a.reset(); Kd 22 Dodavanje Google Maps komponente (XML)
some_element.startAnimation(a);

Kd 17 Definiranje animacije (JAVA) Unutar XML kda forme stvaramo element tipa
com.google.android.maps.MapView kako to prikazuje
isjeak u kodu (22). Takoer, unutar manifest datoteke je
4.10 Rad s mrenom infrastrukturom potrebno dodati i odgovarajui isjeak definiran u kodu
koji slijedi (23).
Koncepti koritenja beine mree (WiFi, Bluetootha,
GSM) su takoer kao i velika veina koncepata relativno <uses-library
jednostavni za koritenje. Dovoljno je zatraiti od
sustava dozvolu za koritenje, te manipulirati objektima. android:name="com.google.android.maps"/>
Kod ovih koncepata moe doi do problema obzirom na <uses-permission
razliite verzije SDK-a. Naime, starije verzije ne
podravaju neke funkcionalnosti, te je potrebno istima android:name="android.permission.INTERNET"/>
ograniiti pristup putem Manifest datoteke ili
implementirati kontrolu verzije unutar same aplikacije. Kd 23 Proirenje manifest datoteke
GPS za razliku od beinih mrea nije doivio vee
promjene, te koritenje istoga takoer ne predstavlja 4.12 Rad s dretvama
velike probleme. Rad s GPS-om se svodi na traenje
dozvole i koritenje preddefiniranih objekata. Slijedei Android podrava viedretvenost (engl. multi-threading),
isjeci kda prikazuju koritenje pojedinih infrastrukturnih to nam uvelike olakava izradu i funkcioniranje
koncepata na Android mobilnim ureajima: sloenijih aplikacija. Dretve se mogu koristiti na dva
naina: tako da se izvravaju na UI Thread-u to
WifiManager wm = naravno blokira isti, ili kao pozadinske dretve, iji je
(WifiManager)getSystemService(Context.WIFI_SE posao obino odraditi neki vremenski opseniji posao,
RVICE); tako da se UI Thread ne blokira, to znai da korisnik
Kd 18 Koritenje WiFi infrastrukture moe nastaviti rad s aplikacijom dok eka na rezultat
izvravanja. Komunikaciju izmeu dretvi mogue je
realizirati na vie naina. Jedan od poznatijih i
BluetoothAdapter bm = primjenjenijih je koritenje Handlera, kako bi se slale
BluetoothAdapter.getDefaultAdapter(); poruke meu dretvama i dogovorio tijek izvravanja. Jo
jedan vaan koncept preuzet iz Jave je koritenje tako
Kd 19 Koritenje Bluetooth infrastrukture zvanih sinkroniziranih (engl. syncronized) blokova za
sinkronizaciju izmeu dretvi [10].
TelephonyManager tm =
(TelephonyManager)getSystemService( 4.13 Dinamina izmjena formi
Context.TELEPHONY_SERVICE);
Kod Android platforme mogue je izmjenjivati prikaz
Kd 20 Koritenje GSM infrastrukture za pozive elemenata (View-ove) prilikom izvravanja aplikacije
ukoliko prikaz ovisi o prijanjoj akciji. Primjer ovog
koncepta je mogunost izmjene sadraja u sklopu
LocationManager lm = dijaloga, kako je prije navedeno za unos malih koliina
(LocationManager)getSystemService( podataka. Isti postupak vrijedi takoer i za izbornik,
Context.LOCATION_SERVICE); svojstva, animacije i ostale koncepte.
Kd 21 Koritenje GPS infrastrukture
CASEmobile - MOBILNE RAZVOJNE TEHNOLOGIJE I RJEENJA 113

4.14 Ostali koncepti 5.4 Dizajn formi


Android SDK se pobrinuo i za ostale koncepte kao to su Tipini primjer primjene koncepata na krivi nain su
vibracije, zvuk, slika, pokretna slika i tako dalje, te je u forme. Naravno valja naglasiti kako neki koncepti nisu
platformu ugraena opsena funkcionalnost za namijenjeni da se koriste na ovaj ili onaj nain. Problemi
manipulaciju nad istima kroz primjenu odgovarajuih kod izgleda formi su ideje dizajnera koje nisu provedive
klasa. Koncepti se relativno jednostavno koriste i u na jednostavan nain putem ugraenih funkcionalnosti,
skladu su ostatkom Java odnosno Android filozofije [7]. te ih treba doslovno programirati koritenjem onDraw
metode ili slino. Kako je paleta ureaja na tritu velika,
postoji dosta razlika meu modelima. Tako na primjer
5. PROBLEMI esto problem predstavljaju irina i visina ekrana.
5.1 Instalacija okruenja Android podrava dva naina odreivanja veliine
elemenata: statini i relativni. Dolazimo do zakljuka
Iz ranije navedenoga, programira se u programskom kako je bolje koristiti relativni nain odreivanja veliine
jeziku Java. Kako bismo isto mogli provoditi vano je elemenata s obzirom na raspon veliine ekrana. Dakako
stvoriti adekvatno razvojno okruenje. Ovisno o ovakav nain pozicioniranja za sobom dovodi specifine
operativnom sustavu na kojem razvijamo aplikaciju, probleme. Ne rijetko dolazi do problema prilikom
preuzimamo SDK sa slubenog web mjesta: pozicioniranja elemenata ili previe kompleksnog
http://developer.android.com/sdk/index.html. SDK dizajna. Provoenje takvog dizajna ponekad nije
instalacija je automatizirani proces. Kako se na efektivno, te bi se dizajnera trebalo obrazovati. Google tj.
stranicama preporuuje koritenje Eclipse integriranog Andorid se i za to pobrinuo, te na svoje stranice stavio
razvojnog okruenja (eng. IDE), istoga takoer paket za dizajnere (engl. designer pack) u kojem se
preuzimamo sa Interneta. Nadalje, Java JRE (engl. Java nalazi skoro sve za aktivni poetak dizajniranja. Takoer
Runtime Environment) koji dolazi sa OS-om nije se na istima nalazi i vodi kako zapoeti, na to paziti i
namijenjen razvoju, te je potrebno preuzeti Java JDK slino. Poznati problem prilikom izrade formi jest
(engl. Java Development Kit). pozicioniranje tekstualnih oznaka (engl. label) u odnosu
Pokretanje razvojnog okruenja vremenski ne traje dugo. na polje za unos podataka bez definiranja fiksnih
Prije opisani proces zahtjeva, naravno ovisno o brzini veliina. Rezultat je esto jedan element prikazan lijevo,
Interneta kojim raspolaete, oko 30-tak minuta. Ovisno o a drugi desno. Naalost rjeenje ovog problema je iroko
prihvaeni hack prikazan isjekom:
izborima prilikom instalacijske procedure, ovo razvojno
okruenje moe zauzeti dosta prostora na tvrdom disku. <TableLayout
To je shvatljivo obzirom da SDK moe sadravati vie android:id="@+id/buttons"
virtualnih slika mobilnih OS-a, koji razumljivo i zauzimaju android:layout_width="fill_parent"
dosta prostora. android:layout_height="wrap_content">
<TableRow>
5.2 Emulatori i fiziki ureaji <ImageButton
android:id="@+id/button_left "
U Eclipse-u je potrebno umetnuti putanju do novo android:layout_width="0dip"
kreirane SDK mape, te stvoriti emulator koji e nam
omoguiti razvoj aplikacije bez koritenja stvarnog
ureaja. Ukoliko imamo fiziki ureaj emulator nije android:layout_height="wrap_content"
potreban, te je mogue izvravati aplikacije i ispravljati android:layout_weight="1" />
pogreke na samome ureaju, to za sobom dovodi i <ImageButton
prve probleme prilikom izrade aplikacija: emulirana android:id="@+id/button_right "
verzija Androida ne moe podravati funkcionalnosti kao android:layout_width="0dip"
to su WiFi, BT, GPS, IR i tako dalje, iz razloga to je za
te funkcionalnosti potreban fiziki ureaj. Ukoliko se android:layout_height="wrap_content"
izrauju aplikacije koje koriste ba ove koncepte, nuno android:layout_weight="1" />
je nabaviti fiziki ureaj. Fizike mobilne ureaje mogue </TableRow>
je putem USB kabla spojiti na raunalo. Kako bismo to </TableLayout>
mogli napraviti moramo biti upoznati s odreenim
konceptima. Naime USB veza radi besprijekorno samo
na OSx platformi. Kod Windows-a potrebno je instalirati Kd 24 Pozicioniranje kontroli relativno jednu do druge
posebne USB pokretae (engl. drivers) kako bi se
mobilni ureaj mogao koristiti za razvoj aplikacija. Linux Isto tako vano je znati prednosti i mane odreene grupe
OS ne razumije Vendor id ureaja te je potrebno pogleda (engl. View), kako biste mogli iskoristiti sve
napraviti tablicu ovih oznaka. njegove prednosti a moda i sakrili mane.

5.3 Ispravljanje pogreaka Ako se na kratko osvrnemo na prije navedeno,


primjeujemo kako programiranje u Androidu moe jako
Ovisno o odluci o koritenju fizikog ureaja, za efikasno brzo postati jako komplicirano.
traenje pogreaka u kdu, logiranje i ispravljanje
pogreaka, potrebno je i postaviti AndroidManifest.xml 6.5 Dinamine liste
datoteku. U aplikacijski element dodaje se atribut
Tipian primjer kompliciranja su dinamine liste
debuggable=true [8].
vrijednosti. Takvom problemu se moe pristupiti na dva
Kada imamo okruenje u kojemu moemo raditi, naina, ovisno o mjestu i nainu primjene. Zamislimo
preostaje nam jedino opisati neke mogue probleme koji dva scenarija, jedan scenarij potrebuje listu vrijednosti iz
nastaju prilikom razvoja. Dakako tema rada nije baze za izbor neke od ponuenih vrijednosti, dok drugi
rjeavanje semantikih i logikih greaka, ve mogue predstavlja pretraivanje datoteke u sustavu.
nedoumice oko koncepata.
114 CASEmobile - MOBILNE RAZVOJNE TEHNOLOGIJE I RJEENJA

Adresirajmo prvo prvi scenarij. Raditi novu formu za


new Thread(new Runnable()
izbor radi ovakvog problema moe naruiti dizajn. Meu
{
naprednijim konceptima spominjali smo Adaptere. Isti public void run()
su kreirani ba za ovakve svrhe. {
final Bitmap b = loadImage();
ArrayList<Map<String, String>> server_list =
image.post(new Runnable() {
list_values;
public void run() {
String[] from = {"name", "version"}; image.setImageBitmap(b);
int[] to = {R.id.name, R.id.version}; }
SimpleAdapter adapter = new });
SimpleAdapter(getApplicationContext(), list, }
R.layout.list, from, to); }).start();
list.setAdapter(adapter);
Kd 26 Stvaranje dretve
Kd 25 Dinamine liste uz pomo adaptera
private class DownloadImage extends
Primijetimo neke prednosti ovoga kda: vrlo jednostavna AsyncTask<String, Void, Bitmap>
primjena ovog koncepta je kada je poznat cilj i svrha, {
moe se napraviti efikasno i modularno rjeenje protected Bitmap doInBackground(String
url)
zahvaljujui sofisticiranom adresiranju polja (moe se
{
mijenjati nain prikazivanja bez da se dira prikazani dio
return loadImage (url);
kda), te brzina. Naime, u programiranju manje je vie }
(engl. less is more). protected void onPostExecute(Bitmap
to se tie drugog primjera, liste datoteka koje biste result)
pretraivali, koristili bismo drugaiji adapter. Malim {
pretraivanjem dokumentacije primijetili bismo kako image.setImageBitmap(result);
}
Android podrava neto nalik na Activity ukoliko
}
koristimo ListView kao omota naih elemenata unutar
forme. ListView je pogled u obliku liste, koji ima
predefinirane akcije kao na primjer pretraivanje (engl. Kd 27 Stvaranje AsyncTask-a
scroll). Prije spomenuti Activity je u stvari ListActivity -
klasa koja proiruje activity. Putem nje moe se prikazati Kratkim osvrtom primjeujemo kako Android oito prua
lista i koristiti sve prednosti ovog pogleda. Takoer kao u dosta jako razvojno okruenje. Uz dobru dokumentaciju i
prethodnom primjeru postavljamo adapter na listu, u dobru ideju, lako je razvijati bogate aplikacije. Neto
ovom sluaju na Activity to rezultira jednom listom, malo vremena za programiranje, te neto vie vremena
preko cijelog ekrana. Tada je jednostavno napraviti za razmiljanje rezultira formulom uspjeha u ovom
dodatnu funkcionalnost obzirom na neki od dogaaja. okruenju.
Dakle, dva slina koncepta primijenjena na znatno
razliitim primjerima pribliavaju nas shvaanju rada i 6. ZAKLJUAK
razvoja aplikacija u ovom okruenju. Vrlo je vano,
razlikovati i primjenjivati koncepte gdje su potrebni na U radu su opisani samo neki osnovni i neki napredniji
nain kako su zamiljeni. koncepti koji se koriste prilikom izrade Android aplikacija.
Ukazano je na mnoge prednosti i mane rada u ovoj
5.6 Dretve platformi. Konzistentno provoenje kvalitetne prakse i
kulture programiranja na Android platformi ju svakako
U napredne koncepte svrstane su i dretve. ini jednostavnijom i primamljivijim izborom. Koncepte je
Viedretvenost je ponekad vana, no ne i neizbjena. uvijek potrebno koristiti na nain kako su i zamiljeni.
Android posjeduje razne koncepte kojima omoguava Takvim pristupom aplikacije mogu dobivati na
izvravanje aplikacije, te su dretve samo jedan segment svrsishodnosti, te platforma profitirati zbog svojih naela
istih. Prije same upotrebe dretvi trebali bismo znati prvo otvorenog koda. Android platforma je od samih poetaka
neke injenice. Android posjeduje ANR dogaaj (engl. bila stigmatizirana kao konkurencija Apple iPhone
Application Not Responding) kako bi osigurao stabilnost platformi (iOS). I kao takva se morala boriti kvalitetom
OS-a [10]. Ukoliko je UI Thread blokiran dulje od kako bi opstala na tritu. U zadnje vrijeme se sve ee
priblino 5 sekundi, javlja se ANR dijalog. Dedukcijom moe uti i proitati kako Android polako nadilazi iPhone
dolazimo do zakljuka kako ne smijemo zaustaviti i iOS. Tome se ponajvie moe zahvaliti velikoj zajednici
izvravanje UI Thread iz razloga to to predstavlja loe otvorenog koda koja do Androida nije imala svog
korisniko iskustvo (engl. User Experience). Ako ba predstavnika na tritu mobilnih platformi. Google kao
elimo koristi dretve, prebacujemo se na posebne, pokreta Android pokreta puno energije i resursa ulae u
pozadinske dretve (engl. backround threads) ili dretve odravanje zajednice kako bi ta ista zajednica vratila
radilice (engl. worker threads) koje slue za izvravanje uloeno kroz unapreenje Android platforme. Zbog svog
zadatka na nain da ne blokiraju glavnu dretvu. Android ekskluzivnog odnosa prema svojim developerima Apple
posjeduje razne naine komunikacije izmeu dretvi, pa sigurno privlai jedan dio zajednice na svoju stranu
ak i komunikacije sa glavnom dretvom. Za razliku od unato tome to je financijski puno tee biti iOS
kompliciranih dretvi, Android nudi slinu zamjenu u vidu developer nego Android developer gdje su svi resursi
izvrenja asinkronog zadatka (engl. AsyncTask). Isti za javno i besplatno dostupni osim, naravno, fizikog
razliku od dretve moe biti pokrenut samo jedanput, te ureaja.
mora biti stvoren na glavnoj dretvi. Takoer ima
mogunost rada u pozadini i to putem ugraene funkcije U samo 3. godine, od ne tako davne 2008. godine,
doInBackground [10]. primjeujemo solidan utjecaj ove platforme na mobilni
svijet. Napredak, dorade, performanse a i trite svakako
govore za sebe. Trite mobilnih aplikacija je danas
CASEmobile - MOBILNE RAZVOJNE TEHNOLOGIJE I RJEENJA 115

jedno od najkonkurentnijih trita gdje svi veliki igrai primamljiv poslovni model po kojem developer sudjeluje
ulau mnogo resursa za razvoj. Prepoznato je da je u dobiti koja je nastala prodajom aplikacije koju je on
mobilna platforma sama po sebi beskorisna ukoliko ne razvio. Nedostatak Android platforme je jedino u injenici
posjeduje iroku paletu aplikacija. Model malih i relativno da su konani korisnici, u pravilu, doli iz zajednice
jeftinih aplikacija na jednom mjestu se pokazao izuzetno otvorenog koda i navikli su na besplatne aplikacije.
primamljivim za potencijalne korisnike mobilne platforme. Kao i u drugim podrujima, sraz izmeu kvalitete i
Mobilna platforma mora svojim tehnikim kvantitete te izmeu poslovnih modela koji ukljuuju i ne
karakteristikama i jednostavnou razvoja aplikacija ukljuuju plaanje ima znaajne i duboke argumente koji
moi privui to vie developera koji e oplemeniti vuku na jednu i na drugu stranu. Smatramo da je
platformu za dodatnim aplikacijama. Uz tehniki dio, najbolje ostaviti itatelju da sam odlui.
proizvoa platforme mora developerima pruiti i
Literatura:
1 Morrill D.: Announcing the Android 1.0 SDK, release 1, Android Developers Blog, 2008.
Izvor: http://android-developers.blogspot.com/2008/09/announcing-android-10-sdk-release-1.html (uitano:
14.4.2011.)
2 Rogers R., Lombardo J., Mednieks Z., Meike B.: Android Application Development: Programming with the Google
SDK, O'Reilly Media Inc., Sebastopol, 2009.
3 ***: Android Basics: Application Fundametals, Android Developers, 2011.
Izvor: http://developer.android.com/guide/topics/fundamentals.html (uitano, 30.04.2011)
4 ***: Framework Topics: Audio and Video, Android Developers, 2011.
Izvor: http://developer.android.com/guide/topics/media/index.html (uitano, 30.04.2011)
5 ***: Framework Topics: Data Storage, Android Developers, 2011.
Izvor: http://developer.android.com/guide/topics/data/data-storage.html (uitano, 30.04.2011)
6 ***: Framework Topics: Graphics, Android Developers, 2011.
Izvor: http://developer.android.com/guide/topics/graphics/index.html (uitano, 07.05.2011)
7 ***: Framework Topics: Location and Maps, Android Developers, 2011.
Izvor: http://developer.android.com/guide/topics/location/index.html (uitano, 30.04.2011)
8 ***: Framework Topics: The AndroidManifest.xml File, Android Developers, 2011.
Izvor: http://developer.android.com/guide/topics/manifest/manifest-intro.html (uitano, 09.05.2011)
9 ***: Framework Topics: User Interface, Android Developer, 2011.
Izvor: http://developer.android.com/guide/topics/ui/index.html (uitano, 14.05.2011)
10 ***: Technical Resources: Painless Threading, Android Developers, 2011.
Izvor: http://developer.android.com/resources/articles/painless-threading.html (uitano, 30.04.2011)

Podaci o autorima:
Ognjen Ribii, univ. bacc. inf.
e-mail: ognjen.ribicic@foi.hr

Ognjen Ribii, univ. bacc. inf., je od svoje 13. godine u stalnom doticaju sa raunalima i informatikim svijetom, to i
odabire kao svoju primarnu struku. 2009. godine zavrava svoje prvostupniko obrazovanje na Tehnikom veleuilitu u
Zagrebu, te iste godine nastavlja naobrazbu na Fakultetu organizacije i informatike u Varadinu. Podruja interesa su mu
razvoj mobilnih i Web aplikacija, te razvoj, odravanje i modeliranje baza podataka, to i jest njegovo usmjerenje na
diplomskom studiju.

Boris Toma, mag. inf.


tel: +385 42 390 853
fax: +385 42 213 413
e-mail: boris.tomas@foi.hr

Boris Toma, mag. Inf. je od 2010. godine zaposlen kao asistent na Katedri za razvoj informacijskih sustava na Fakultetu
organizacije i informatike u Varadinu. Na istom fakultetu je i student poslijediplomskog doktorskog studija Informacijskih
znanosti. Podruja interesa su mobilne aplikacije, razvoj programskih proizvoda, razvoj GIS aplikacija, multimedijski sustavi
i aplikacijski marketing te marketing programskih proizvoda. Posjeduje dugogodinje iskustvo sa Microsoft tehnologijama
za razvoj aplikacija za veinu arhitektura i platformi.

Zlatko Stapi, mag. inf.


tel: +385 42 390 853
fax: +385 42 213 413
e-mail: zlatko.stapic@foi.hr

Zlatko Stapi, mag. inf. je od 2006. godine asistent na Katedri za razvoj informacijskih sustava na Fakultetu organizacije i
informatike u Varadinu, te polaznik poslijediplomskog doktorskog studija Informacijske znanosti na istom fakultetu.
Njegova nastavna aktivnost je prvenstveno usmjerena na kolegije koji se odnose na programsko inenjerstvo, analizu i
116 CASEmobile - MOBILNE RAZVOJNE TEHNOLOGIJE I RJEENJA

razvoj programa, modeliranje poslovnih procesa i razvoj informacijskih sustava, te znaajne napore ulae u radu sa
studentima za to je dobio i posebna priznanja.
Iz znanstvenog i strunog rada treba izdvojiti viegodinje voditeljstvo strunih projekata razvoja programskih proizvoda i
sudjelovanje na razliitim strunim i znanstvenim projektima iz podruja razvoja, unapreenja poslovnih procesa,
projektnog menadmenta i slino.
U posljednje vrijeme se intenzivno bavi razvojem aplikacija za mobilne ureaje, to je i predmet njegovog istraivanja u
okviru doktorske disertacije, a osobito je vrijedno istaknuti da razvija za skoro sve platforme, ukljuujui izmeu ostalog
Android, Symbian te Windows Phone 7. Zlatkov detaljniji ivotopis, s popisom svih radova, projekata i nagrada, te drugih
vanih podataka moe se pronai na njegovoj osobnoj web stranici, na http://www.foi.hr/djelatnici/zlatko.stapic.

Zlatko Stapi is a young researcher and teaching assistant at the Faculty of Organization and Informatics working at the
Information systems development department. His main areas of interests include classic and agile software engineering
methodologies, software and information systems development, business processes modeling and others.

Fakultet organizacije i informatike


Pavlinska 2
42000 Varadin

You might also like