ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙ∆ΕΥΤΙΚΟ Ι∆ΡΥΜΑ (ΤΕΙ)
∆ΥΤΙΚΗΣ ΜΑΚΕ∆ΟΝΙΑΣ
ΠΑΡΑΡΤΗΜΑ ΚΑΣΤΟΡΙΑΣ
ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ
Σχεδιασμός, ανάπτυξη και υλοποίηση διαδραστικής
εφαρμογής για κινητές συσκευές (smartphones,
PDAs, EDAs, κλπ.) για την παρουσίαση χρήσιμων
τοπικών πληροφοριών κατά τη διάρκεια ταξιδιού
αξιοποιώντας τη γεωγραφική θέση και τα
ενδιαφέροντα του επισκέπτη
ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ
της
ΑΝ∆ΡΙΚΟΠΟΥΛΟΥ ΕΥΑΓΓΕΛΙΑΣ
(ΑΕΜ: 555)
Επιβλέπων : Σπυρίδων Νικολάου
Καθηγητής Εφαρμογών
Καστοριά Νοέμβριος 2012
i
Η παρούσα σελίδα σκοπίμως παραμένει λευκή
ii
ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙ∆ΕΥΤΙΚΟ Ι∆ΡΥΜΑ (ΤΕΙ)
∆ΥΤΙΚΗΣ ΜΑΚΕ∆ΟΝΙΑΣ
ΠΑΡΑΡΤΗΜΑ ΚΑΣΤΟΡΙΑΣ
ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ
Σχεδιασμός, ανάπτυξη και υλοποίηση διαδραστικής
εφαρμογής για κινητές συσκευές (smartphones,
PDAs, EDAs, κλπ.) για την παρουσίαση χρήσιμων
τοπικών πληροφοριών κατά τη διάρκεια ταξιδιού
αξιοποιώντας τη γεωγραφική θέση και τα
ενδιαφέροντα του επισκέπτη
ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ
της
ΑΝ∆ΡΙΚΟΠΟΥΛΟΥ ΕΥΑΓΓΕΛΙΑΣ
(ΑΕΜ: 555)
Επιβλέπων : Σπυρίδων Νικολάου
Καθηγητής Εφαρμογών
Εγκρίθηκε από την τριμελή εξεταστική επιτροπή την 9η Νοεμβρίου 2012
Νικολάου Σπυρίδων
Καθηγητής Εφαρμογών
Θεοδοσόπουλος Ιάκωβος
Επιστημονικός Συνεργάτης
Ζήκος Γεώργιος
Επιστημονικός Συνεργάτης
Καστοριά Νοέμβριος 2012
iii
Copyright © 2012 – ΑΝ∆ΡΙΚΟΠΟΥΛΟΥ ΕΥΑΓΓΕΛΙΑ
Απαγορεύεται η αντιγραφή, αποθήκευση και διανομή της παρούσας εργασίας, εξ
ολοκλήρου ή τμήματος αυτής, για εμπορικό σκοπό. Επιτρέπεται η ανατύπωση,
αποθήκευση και διανομή για σκοπό μη κερδοσκοπικό, εκπαιδευτικής ή ερευνητικής
φύσης, υπό την προϋπόθεση να αναφέρεται η πηγή προέλευσης και να διατηρείται το
παρόν μήνυμα
Οι απόψεις και τα συμπεράσματα που περιέχονται σε αυτό το έγγραφο εκφράζουν
αποκλειστικά τον συγγραφέα και δεν αντιπροσωπεύουν τις επίσημες θέσεις του ΤΕΙ
∆υτικής Μακεδονίας.
iv
ΕΥΧΑΡΙΣΤΙΕΣ
Θα ήθελα να ευχαριστήσω θερμά τον καθηγητή κύριο Νικολάου Σπύρο,
για την εμπιστοσύνη που μου έδειξε αναθέτοντας μου την παρούσα πτυχιακή
εργασία, καθώς και για την καθοδήγηση και την πολύτιμη βοήθεια του καθ’ όλη
τη διάρκεια της εκπόνησής της.
Επίσης, θα ήθελα να ευχαριστήσω την οικογένειά μου, η οποία με τη
συνεχή στήριξη της με βοήθησε στην ολοκλήρωση της εργασίας μου.
Τέλος, θα ήθελα να ευχαριστήσω ιδιαίτερα τoν Παπαθεοδώρου Θόδωρο
και τον Οικονόμου Γεώργιο για την πολύτιμη βοήθεια τους στην πτυχιακή
εργασία μου.
I
ΠΕΡΙΛΗΨΗ
Η παρούσα διπλωματική εργασία έχει ως κύριο στόχο την ανάπτυξη μίας
διαδραστικής εφαρμογής σε περιβάλλον Android. Η εφαρμογή αυτή επιτρέπει
στο χρήστη κινητού τηλεφώνου με λειτουργικό σύστημα Android να αξιοποιεί τη
γεωγραφική του θέση έτσι ώστε να έχει πρόσβαση σε διάφορες χρήσιμες
τοπικές πληροφορίες ακόμα και κατά την διάρκεια ταξιδιού σύμφωνα πάντα με
τα ενδιαφέροντα του.
Το Android είναι λογισμικό ανοικτού κώδικα, όπου οποιοσδήποτε
χρήστης έχει την δυνατότητα να σχεδιάσει τη δική του εφαρμογή, ανάλογα με τις
ανάγκες του. Με την βοήθεια μάλιστα ειδικών βιβλιοθηκών που το Android έχει
ενσωματωμένες στην πλατφόρμα του, η ανάπτυξη καινοτόμων εφαρμογών που
βασίζονται στη γεωγραφική θέση του χρήστη γίνεται εύκολη υπόθεση.
ΛΕΞΕΙΣ ΚΛΕΙ∆ΙΑ
Λειτουργικό σύστημα Android, έξυπνα κινητά τηλέφωνα (smartphones),
υπηρεσίες βασισμένες στη γεωγραφική θέση (LBS), παγκόσμιο σύστημα
πλοήγησης με γεωγραφικές συντεταγμένες (GPS), geocoding, Eclipse, Java,
JDK, Android SDK ADT.
II
ABSTRACT
The main goal of this dissertation is the development of an interactive
application in Android platform. This application allows the Android mobile
phone user, to browse useful local information - even while travelling - based
upon its geographic location and the user’s preferences.
Android is an open source software platform, where a developer can
customize the design of each application, depending on the users’ needs. The
availability of a plethora of specific libraries embedded in Android platform,
makes the development of innovative location based service applications a
relatively easy task.
KEYWORDS
Android platform, Smartphones, Location Based Services (LBS), Geographical
Positioning System (GPS), geocoding, Eclipse, Java, Development Kit, Android
Software Development Kit, Android Development Tools.
III
ΠΕΡΙΕΧΟΜΕΝΑ
ΠΕΡΙΛΗΨΗ..................................................................................................................... II
ABSTRACT................................................................................................................... III
ΠΕΡΙΕΧΟΜΕΝΑ ............................................................................................................ IV
ΕΥΡΕΤΗΡΙΟ ΕΙΚΟΝΩΝ ................................................................................................ VI
ΕΥΡΕΤΗΡΙΟ ΠΙΝΑΚΩΝ ................................................................................................ VI
ΕΙΣΑΓΩΓΗ...................................................................................................................... 1
ΚΕΦΑΛΑΙΟ 1. ΘΕΩΡΗΤΙΚΗ ΤΕΚΜΗΡΙΩΣΗ ................................................................ 3
1.1 ΣΚΟΠΟΣ ΤΗΣ ΕΡΓΑΣΙΑΣ .................................................................................3
1.2 SMARTPHONES ................................................................................................4
1.3 Η ΠΛΑΤΦΟΡΜΑ ANDROID..............................................................................5
1.3.1 Η Ιστορία του Android .........................................................................5
1.3.2 Βασικά γνωρίσματα του Android.........................................................6
1.3.3 Αρχιτεκτονική του Android ..................................................................7
1.4 ΥΠΗΡΕΣΙΕΣ ΜΕ ΒΑΣΗ ΤΗ ΘΕΣΗ ΤΟΥ ΧΡΗΣΤΗ ........................................8
1.4.1 Εισαγωγή στις υπηρεσίες εντοπισμού θέσης......................................8
1.4.2 Σημαντικά χαρακτηριστικά ..................................................................9
1.4.3 ∆ομικά μέρη των υπηρεσιών με βάση τη γεωγραφική θέση του
χρήστη .......................................................................................................10
1.4.4 Αρχιτεκτονική μίας υπηρεσίας βασισμένης στη γεωγραφική θέση του
χρήστη .......................................................................................................11
1.5 ΤΕΧΝΟΛΟΓΙΑ ΑΝΙΧΝΕΥΣΗΣ ΘΕΣΗΣ GPS.................................................12
1.5.1 Εισαγωγή ..........................................................................................12
1.5.2 Η δομή του GPS ...............................................................................13
1.6 ΑΛΛΕΣ ΤΕΧΝΟΛΟΓΙΕΣ ΑΝΙΧΝΕΥΣΗΣ ΘΕΣΗΣ...........................................15
1.6.1 GALILEO ..........................................................................................15
ΚΕΦΑΛΑΙΟ 2. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΕ ΠΕΡΙΒΑΛΛΟΝ ANDROID ....................... 17
2.1 ΕΙΣΑΓΩΓΗ..........................................................................................................17
2.2 ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΑ ΕΡΓΑΛΕΙΑ ................................................................17
2.3 ΣΥΣΤΑΤΙΚΑ ΣΤΟΙΧΕΙΑ ANDROID ΕΦΑΡΜΟΓΗΣ ......................................19
2.3.1 Activities............................................................................................20
2.3.2 Services ............................................................................................21
2.3.3 Content Providers .............................................................................22
2.3.4 Broadcast Receivers.........................................................................23
IV
2.4 USER INTERFACE ..........................................................................................23
2.4.1 Layout ...............................................................................................24
2.4.2 Μενού ...............................................................................................25
2.4.2.1 Options Menu .............................................................................25
2.4.2.2 Context Menu .............................................................................25
2.4.2.3 Submenu....................................................................................26
2.4.3 Dialogs..............................................................................................26
2.4.4 Ενημερώνοντας το χρήστη ...............................................................26
2.5 APPLICATION RESOURCES ........................................................................27
2.5.1 Προσανατολισμός .............................................................................27
2.5.2 Μέγεθος οθόνης................................................................................28
2.5.3 Γλώσσα.............................................................................................28
2.6 ANDROID MANIFEST .....................................................................................29
ΚΕΦΑΛΑΙΟ 3 ΦΑΣΕΙΣ ΑΝΑΠΤΥΞΗΣ ΕΦΑΡΜΟΓΗΣ................................................. 30
3.1 ΑΝΑΛΥΣΗ ...........................................................................................................30
3.2 ΣΧΕ∆ΙΑΣΗ ..........................................................................................................32
3.2.1 Απαιτήσεις σχεδιασμού.....................................................................32
3.2.2 ∆ομή της Εφαρμογής........................................................................33
3.3 ΥΛΟΠΟΙΗΣΗ ......................................................................................................34
3.3.1 Πλατφόρμα και εργαλεία ανάπτυξης .................................................34
3.3.2 Αρχιτεκτονική της εφαρμογής ...........................................................34
3.3.3 Χρήση της εφαρμογής ......................................................................38
3.4 ΕΛΕΓΧΟΣ............................................................................................................53
3.5 ∆ΙΑΝΟΜΗ ...........................................................................................................53
ΚΕΦΑΛΑΙΟ 4. ΣΥΜΠΕΡΑΣΜΑΤΑ – ΜΕΛΛΟΝΤΙΚΕΣ ΕΠΕΚΤΑΣΕΙΣ......................... 54
4.1 ΣΥΜΠΕΡΑΣΜΑΤΑ .............................................................................................54
4.2 ΜΕΛΛΟΝΤΙΚΕΣ ΕΠΕΚΤΑΣΕΙΣ........................................................................54
ΒΙΒΛΙΟΓΡΑΦΙΑ ........................................................................................................... 56
ΠΑΡΑΡΤΗΜΑ I - ΚΩ∆ΙΚΑΣ ΕΦΑΡΜΟΓΗΣ ................................................................. 58
ΠΑΡΑΡΤΗΜΑ ΙI – ΠΛΑΤΦΟΡΜΑ & ΕΡΓΑΛΕΙΑ ΑΝΑΠΤΥΞΗΣ .................................... 82
V
ΕΥΡΕΤΗΡΙΟ ΕΙΚΟΝΩΝ
Εικόνα 1-1: Η αρχιτεκτονική του Android ........................................................... 8
Εικόνα 1-2: Βασικά συστατικά μιας location-based υπηρεσίας ........................ 10
Εικόνα 1-3 Βασική αρχιτεκτονική μιας Location-based .................................... 11
Εικόνα 1-4: Τμήμα διαστήματος....................................................................... 13
Εικόνα 1-5: Τμήμα ελέγχου .............................................................................. 14
Εικόνα 2-1: Το περιβάλλον ανάπτυξης λογισμικού Eclipse.............................. 18
Εικόνα 2-2: Εικονική συσκευή με λειτουργικό σύστημα Android (AVD) ........... 19
Εικόνα 2-3: Ο κύκλος ζωής των activities και οι αντίστοιχες μέθοδοι ............... 21
Εικόνα 3-1: Γραμμικό μοντέλο καταρράκτη...................................................... 30
Εικόνα 3-2: Γενική δομή της εφαρμογής ...........……………………………….…33
Εικόνα 3-3: ∆ομή εφαρμογής ........................................................................... 35
Εικόνα 3-4: Περιεχόμενα φακέλου src/............................................................. 35
Εικόνα 3-5: Περιεχόμενα φακέλου gen/ ........................................................... 36
Εικόνα 3-6: Βιβλιοθήκες του λειτουργικού συστήματος Android ...................... 36
Εικόνα 3-7: Όλα τα resources της εφαρμογής ................................................. 37
Εικόνα 3-8: Γραφική απεικόνιση της δομής της εφαρμογής ............................. 39
Εικόνα 3-9: Αρχική οθόνη ................................................................................ 39
Εικόνα 3-10: Οθόνη επιλογής σημείων ενδιαφέροντος .................................... 46
Εικόνα 3-11: Οθόνη αποτελεσμάτων ............................................................... 49
ΕΥΡΕΤΗΡΙΟ ΠΙΝΑΚΩΝ
Πίνακας 3-1 : Καταγραφή βασικών ιδεών……………………………………. ..... 31
Πίνακας 3-2 : Πλάνο & χρονοπρογραμματισμός έργου……………………… ... 32
VI
ΕΙΣΑΓΩΓΗ
Η παρούσα εργασία ασχολείται με την ανάπτυξη μιας διαδραστικής
εφαρμογής για κινητές συσκευές για την παρουσίαση χρήσιμων τοπικών
πληροφοριών κατά τη διάρκεια ταξιδιού αξιοποιώντας τη γεωγραφική θέση και
τα ενδιαφέροντα του.
Στο πρώτο κεφάλαιο, αρχικά περιγράφεται ο σκοπός της εργασίας και
ακολουθεί μια εισαγωγή στα έξυπνα κινητά τηλέφωνα (smartphones) καθώς και
στα κυριότερα λειτουργικά τους συστήματα. Στη συνέχεια, παρουσιάζεται πιο
αναλυτικά το λειτουργικό σύστημα Android, με ιστορική αναδρομή στην πορεία
εξέλιξης του, τα βασικά χαρακτηριστικά του καθώς την αρχιτεκτονική του.
Επίσης, παρουσιάζονται οι διαθέσιμες υπηρεσίες για πλατφόρμα Android με
βάση τη γεωγραφική θέση του χρήστη καθώς και τα σημαντικότερα
χαρακτηριστικά τους. Τέλος περιγράφεται η τεχνολογία ανίχνευσης θέσης
(GPS) καθώς και η δομή και λειτουργία της.
Στο δεύτερο κεφάλαιο περιγράφεται η διαδικασία ανάπτυξης εφαρμογών
για
την
πλατφόρμα
Android
και
παρουσιάζονται
τα
αντίστοιχα
προγραμματιστικά εργαλεία. Πιο συγκεκριμένα, παρουσιάζονται το Java
Development Kit (JDK), το γραφικό περιβάλλον ανάπτυξης Eclipse, το Android
SDK (Software Development Kit) για τη συγγραφή του κώδικα για την
κατασκευή εφαρμογής Android καθώς και της επέκτασης Android Development
Tools (ADT Plug-In) που εγκαθιστάμε στο Eclipse ώστε να μπορέσουμε να
μεταγλωττίσουμε και να εκτελέσουμε την εφαρμογή μας. Επίσης, παρατίθεται
ένας προγραμματιστικός οδηγός με τα βήματα που απαιτούνται για να
αναπτυχθεί μια εφαρμογή σε πλατφόρμα Android καθώς και προγραμματιστικές
τεχνικές ώστε η εφαρμογή να είναι λειτουργική και αποδοτική.
Στο τρίτο κεφάλαιο παρουσιάζονται τα στάδια ανάπτυξης και υλοποίησης
της εφαρμογής, δηλαδή τα συγκεκριμένα βήματα που ακολουθήθηκαν
αντίστοιχα στις φάσεις της Ανάλυσης, της Σχεδίασης, της Υλοποίησης, του
Ελέγχου και της ∆ιανομής, έτσι ώστε να επιτευχθεί το τελικό επιθυμητό
αποτέλεσμα.
Στο τελευταίο κεφάλαιο της εργασίας αναλύονται τα συμπεράσματα που
προέκυψαν από την εκπόνηση της παρούσας εργασίας καθώς και οι
μελλοντικές εξελίξεις.
1
Τέλος,
παρατίθεται
η
Βιβλιογραφία
καθώς
και
τα
αντίστοιχα
Παραρτήματα, δηλαδή το Παράρτημα I με τον κώδικα της εφαρμογής και το
Παράρτημα II με την πλατφόρμα και τα εργαλεία ανάπτυξης.
2
ΚΕΦΑΛΑΙΟ 1. ΘΕΩΡΗΤΙΚΗ ΤΕΚΜΗΡΙΩΣΗ
1.1 ΣΚΟΠΟΣ ΤΗΣ ΕΡΓΑΣΙΑΣ
Η απόκτηση της γνώσης της γεωγραφικής πληροφορίας είναι μια πολύ
δελεαστική διαδικασία. Το βασικό χαρακτηριστικό των χρηστών κινητών
τηλεφώνων είναι η κινητικότητα τους. Μπορεί ο καθένας να βρίσκεται σε
οποιοδήποτε μέρος του πλανήτη και να κάνει χρήση πληθώρας υπηρεσιών και
δυνατοτήτων που προσφέρονται από τα σύγχρονα έξυπνα κινητά τηλέφωνα
(Smartphones) [15]. Η αλματώδης αυτή εξέλιξη, η ευρεία χρήση και οι
δυνατότητες των κινητών τηλεφώνων να παρέχουν ανά πάσα στιγμή
πληροφορίες σχετικά με τη γεωγραφική θέση τους σε συνδυασμό με το
τεράστιο εύρος πληροφορίας που είναι πλέον διαθέσιμες για κάθε σημείο
ενδιαφέροντος αποτελεί ένα ισχυρό εφόδιο για την δημιουργία καινοτόμων
εφαρμογών. Η γεωγραφική πληροφορία έχει την έννοια του προσδιορισμού
κάποιας οντότητας στην επιφάνεια της γης με ακρίβεια. Τα δύο μεγέθη τα οποία
χρησιμεύουν στον ακριβέστατο προσδιορισμό είναι το γεωγραφικό μήκος
(longitude) και το γεωγραφικό πλάτος (latitude). Άρα η εκμετάλλευση της
γεωγραφικής πληροφορίας συνεπάγεται την εκμετάλλευση αυτών των δύο
μεγεθών.
Η εφαρμογή που δημιουργήθηκε στα πλαίσια της παρούσας εργασίας
λειτουργεί σε πλατφόρμα Android, που αποτελεί και την σημαντικότερη
πλατφόρμα λογισμικού ανοιχτού κώδικα για κινητά τηλέφωνα. Το Android δεν
είναι μόνο ένα λειτουργικό σύστημα αλλά κι ένα ολοκληρωμένο περιβάλλον
ανάπτυξης εφαρμογών. Το Android κυκλοφόρησε τον Νοέμβριο του 2007 και
από τότε έχει γνωρίσει μεγάλη διάδοση αφού η ανάπτυξη εφαρμογών κινητών
τηλεφώνων έχει διευκολυνθεί ιδιαίτερα, αφού διαθέτει όλα τα πλεονεκτήματα
των λογισμικών ανοιχτού κώδικα (πολύ μεγάλη κοινότητα προγραμματιστών,
δωρεάν διανομή, διάδοση πηγαίου κώδικα, κλπ.).
Ένα από τα βασικά πλεονεκτήματα που έχει το Android είναι η
υποστήριξη των Google Maps. Τα Google Maps είναι μια τεχνολογία
χαρτογράφησης της γης, δηλαδή ψηφιακοί χάρτες. Στην εφαρμογή που
αναπτύσσεται
για
αυτή
τη
πτυχιακή
εργασία
δίνεται
η
δυνατότητα
προσδιορισμού της γεωγραφικής θέσης του χρήστη καθώς και χρήσιμες τοπικές
3
πληροφορίες κατά την διάρκεια ταξιδιού αξιοποιώντας την γεωγραφική θέση και
τα ενδιαφέροντα του χρήστη.
1.2 SMARTPHONES
Η κινητή τηλεφωνία προέκυψε στην ζωή του ανθρώπου με σκοπό να
καλύψει βασικές ανάγκες επικοινωνίας κατά τη μετακίνηση του σε οποιοδήποτε
σημείο κι αν βρίσκεται. Τα πρώτα κινητά τηλέφωνα εμφανίστηκαν στο εμπόριο
το 1983. Η τεχνολογία των πρώτων κινητών τηλεφώνων επέτρεπε αποκλειστικά
και μόνο κλήσεις προς άλλους χρήστες, ενώ μετέπειτα παρουσιάστηκε και η
δυνατότητα αποστολής γραπτών μηνυμάτων. Με την εξέλιξη όμως της
τεχνολογίας δόθηκε και η δυνατότητα αποστολής μηνυμάτων εμπλουτισμένου
κειμένου τα γνωστά ως mms. Το μεγάλο ενδιαφέρον των καταναλωτών γύρω
από την κινητή τηλεφωνία οδήγησε και σε μία από τις πιο ολοκληρωμένες
προτάσεις κινητών συσκευών που πλέον παρέχουν σχεδόν ισάξιες δυνατότητες
μίνι υπολογιστών (notebooks) τα γνωστά ως Smartphones.
Ένα Smartphone είναι ένα κινητό τηλέφωνο το οποίο προσφέρει πιο
προηγμένη
υπολογιστική
ικανότητα.
Συνδυάζει
τις
λειτουργίες
ενός
προσωπικού ψηφιακού βοηθού (PDA) και ενός κινητού τηλεφώνου. Τα
σημερινά μοντέλα χρησιμεύουν επίσης ως φορητές συσκευές αναπαραγωγής
πολυμέσων και κινητά τηλέφωνα με κάμερα με υψηλής ανάλυσης, οθόνη αφής,
πλοήγηση GPS, Wi-Fi και άλλα. Οι σημαντικότερες πλατφόρμες των
σύγχρονων έξυπνων κινητών τηλεφώνων είναι το Apple iOS, το Google
Android, το Microsoft Windows Phone 7, το Nokia Symbian, το Research In
Motion BlackBerry OS και άλλες.
Το λειτουργικό σύστημα Android για Smartphone κυκλοφόρησε το 2008.
Το Android είναι μια open-source πλατφόρμα που υποστηρίζεται από τη
Google, μαζί με μεγάλες εταιρείες υλικού και λογισμικού (όπως η Intel, HTC,
ARM,
Motorola
και
η
Samsung).
Το
πρώτο
κινητό
τηλέφωνο
που
χρησιμοποίησε Android ήταν το HTC Dream, το οποίο ονομάστηκε για τη
διανομή σαν G1 από την T-Mobile. Η σουίτα λογισμικού που περιλαμβάνει
αποκλειστικές εφαρμογές όπως χάρτες, το Ημερολόγιο, το Gmail και ένα πλήρη
HTML web browser.
Εφαρμογές από τρίτους κατασκευαστές, συμπεριλαμβανομένων τόσο
των δωρεάν και των επί πληρωμή εφαρμογών. είναι διαθέσιμες μέσω του
4
Android Market, μιας ψηφιακής πλατφόρμας διανομής εφαρμογών για την
πλατφόρμα Android η οποία δημιουργήθηκε τον Οκτώβριο του 2008 από τη
Google. Να σημειωθεί ότι η υπηρεσία Google Play είναι προσβάσιμη από
συσκευές με λειτουργικό σύστημα Android 2.2 Froyo ή ανώτερο.
Τον Μάρτιο 2012 το Android Market μετονομάστηκε σε Google Play
Store. Το 2009 ξεκίνησε η διάθεση και υποστήριξη Android εφαρμογών επί
πληρωμή αρχικά για δημιουργούς από τις ΗΠΑ και τη Μεγ. Βρετανία και το
2010 επεκτάθηκε και για δημιουργούς από επιπλέον 29 χώρες. Το Φεβρουάριο
2011 η Google εγκαινίασε ένα web client που πρόσφερε πρόσβαση στο
Android Market μέσω PC. Τον Μάρτιο 2012 αυξήθηκε το μέγιστο επιτρεπόμενο
μέγεθος αρχείων των διαθέσιμων εφαρμογών Android από 50ΜΒ σε 4GB
(συμπεριλαμβανομένων 50ΜΒ για το αρχείο APK). Τον Ιούλιο 2012 πρόσθεσε
τη δυνατότητα κρυπτογράφησης των διαθέσιμων εφαρμογών στο Android
Market για να μειώσει την πειρατεία των εφαρμογών. Σήμερα, το Android
Market διαθέτει πάνω από 150.000 εφαρμογές και παιχνίδια. [21],[22],[23]
1.3 Η ΠΛΑΤΦΟΡΜΑ ANDROID
1.3.1 Η Ιστορία του Android
Όλα ξεκίνησαν όταν ο Andy Rubin θέλησε την άνοιξη του 2005 να
χρησιμοποιήσει την Google ως μηχανή αναζήτησης για το T-Mobile Sidekick,
μια συσκευή κινητού, την οποία είχε αναπτύξει με την ομάδα συνεργατών του.
Έπειτα ζήτησε να συναντηθεί με τον Larry Page, ο οποίος είναι ο ένας από τους
δύο ιδρυτές της Google. Σε αυτήν τη συνάντηση ο Rubin παρουσίασε το
Android ως ένα παγκόσμιο ανοικτό λειτουργικό σύστημα που θα άλλαζε για
πάντα τον τρόπο που χρησιμοποιούν οι χρήστες το κινητό τους.
Ο Page δεν ήθελε να γίνει απλώς ο υποστηρικτής του Android, ήθελε να
γίνει ο ιδιοκτήτης του. Ο Andy βρήκε την ώρα που ένας ισχυρός παίκτης
εμφανίστηκε στο προσκήνιο και έθεσε έτσι τους όρους του ανταγωνισμού σε
άλλο επίπεδο. Ο καινούργιος «παίκτης» δεν είναι άλλος από εκείνον που
λάνσαρε το καλοκαίρι του 2005, το iPhone της Apple.
Ο επιχειρηματικός-τεχνολογικός κόσμος περίμενε πως η Google θα
απαντούσε με ένα gPhone, αλλά αυτό δεν έγινε. Το Φθινόπωρο του 2005
5
ανακοινώνεται ότι 34 εταιρίες, όπως η Texas Instruments, η Intel, η T-Mobile και
η Sprint Nextel, ενώνουν τις δυνάμεις τους με την Google για τη δημιουργία μιας
πλατφόρμας ανοιχτού κώδικα που θα έχει ενσωματωμένο το λογισμικό Linux
και θα εκπροσωπείται από μια νέα ομάδα εταιριών που θα καλείται Open
Handset Alliance.
Φυσικά δεν άργησαν να μπουν και άλλες εταιρείες, όπως η HTC, η
Motorola και η LG, ανακοινώνοντας την πρόθεσή τους να δώσουν προς
πώληση στην αγορά smartphones με λειτουργικό σύστημα Android σε διάφορα
σχήματα και μεγέθη, με τα οποία θα μπορεί να έχει ο χρήστης να ενσωματώνει
στο κινητό του πλήθος εφαρμογών.
1.3.2 Βασικά γνωρίσματα του Android
Το Android είναι μια πλατφόρμα λογισμικού ανοιχτού κώδικα που
περιλαμβάνει το λειτουργικό σύστημα που ενσωματώνεται σε συσκευές κινητής
τηλεφωνίας, τα οποία τρέχουν τον πυρήνα (kernel) του λειτουργικού Linux,
επιτρέπει στους κατασκευαστές λογισμικού να συνθέτουν κώδικα με τη χρήση
της γλώσσας προγραμματισμού Java [1], ελέγχοντας τη συσκευή μέσω
βιβλιοθηκών λογισμικού της Google. Συσκευές με Android υπάρχουν πλέον
πάρα πολλές, η καθεμία με διαφορετικά χαρακτηριστικά και από διάφορες
κατασκευάστριες εταιρίες: η LG, Samsung, HTC, Sony Ericsson, Motorola, είναι
μερικές από τις εταιρίες που χρησιμοποιούν το λειτουργικό Android για τα
smartphones τους. Το θετικό με τις συσκευές Android είναι ότι είναι multimedia
(μας δίνουν τη δυνατότητα να αναπαράγουμε πολλαπλά μέσα) και multitasking
(μας δίνουν τη δυνατότητα εκτέλεσης πολλών εφαρμογών ταυτόχρονα).
Το web browsing στο Android είναι γρήγορο και υπάρχουν πολλοί
browsers για να καλύψουν όλες τις ανάγκες. Όλες οι συσκευές Android
διαθέτουν GPS [9] και Wi-Fi, έτσι έχουμε εύκολη πρόσβαση στο διαδίκτυο, σε
συνδυασμό με ένα πλήθος εφαρμογών (apps), όπως χάρτες, αναζήτηση, chat
και e-mail, που πραγματικά επιτρέπουν στο χρήστη να μένει διαρκώς
δικτυωμένος και ενημερωμένος. Άλλο χαρακτηριστικό του Android, είναι η
πληθώρα εφαρμογών που διατηρούν, τη συνεχή σύνδεση με Facebook,
MySpace, Twitter και δεκάδες άλλες υπηρεσίες. Επιπλέον η notification bar
είναι εξαιρετικά χρήσιμη, καθώς βλέπουμε όλες τις ειδοποιήσεις για τη συσκευή
μας, αλλά και τα προγράμματα (applications) που έχουμε εγκαταστήσει.
6
Όσον
αφορά
το
hardware,
οι
διπύρηνοι
επεξεργαστές
και
οι
διακεκριμένες GPU είναι πλέον γεγονός, ενώ αναμένουμε και επεξεργαστές
τεσσάρων πυρήνων, καθώς αυτό έχει ήδη ανακοινωθεί από την Nvidia με τον
επεξεργαστή Kal – El ο οποίος μάλιστα θα περιέχει και έναν πέμπτο πυρήνα.
1.3.3 Αρχιτεκτονική του Android
Η αρχιτεκτονική του Android [5] περιλαμβάνει τα εξής επίπεδα:
•
Επίπεδο Εφαρμογών (Applications): Το Android
περιλαμβάνει ένα
σύνολο από βασικές εφαρμογές που έχουν ένα email client, ένα πρόγραμμα
για SMS μηνύματα, ημερολόγιο, χάρτες (Google Maps), περιηγητή ιστού,
πρόγραμμα για δομημένη αποθήκευση των επαφών και άλλα.
Όλες οι εφαρμογές είναι γραμμένες στην γλώσσα προγραμματισμού Java.
•
Επίπεδο Πλαισίου Εφαρμογών (Applications Framework): Το Android
προσφέρει στους προγραμματιστές την δυνατότητα να κατασκευάσουν
πλούσιες και καινοτόμες εφαρμογές. Οι προγραμματιστές αφήνονται
ελεύθεροι να εκμεταλλευτούν πλήρως το hardware της συσκευής, να έχουν
πρόσβαση σε υπηρεσίες εντοπισμού θέσης, να θέσουν χρονοδιακόπτες για
εμφάνιση ειδοποιήσεων και πολλά άλλα. Επίσης έχουν πλήρη πρόσβαση
στο ίδιο πλαίσιο από APIs που έχουν οι βασικές εφαρμογές του Android.
•
Επίπεδο Βιβλιοθηκών (Libraries): Το οποίο περιλαμβάνει ένα σύνολο από
βιβλιοθήκες γραμμένες σε C/C++ οι οποίες χρησιμοποιούνται από διάφορα
στοιχεία του συστήματος του Android. Οι δυνατότητες που προσφέρουν οι
βιβλιοθήκες αυτές είναι προσβάσιμες στους προγραμματιστές.
•
Επίπεδο Εκτέλεσης (Android Runtime): Το οποίο αποτελείται από ένα
σύνολο από βασικές βιβλιοθήκες και την Dalvik Virtual Machine.
•
Πυρήνας του Linux: Το Android βασίζεται στον πυρήνα Linux έκδοση 2.6
για βασικές υπηρεσίες συστήματος όπως ασφάλεια, διαχείριση μνήμης,
διαχείριση διεργασιών, στοίβα δικτύου, και οδηγούς συσκευών.
7
Εικόνα 1-1: Η αρχιτεκτονική του Android [5]
1.4 ΥΠΗΡΕΣΙΕΣ ΜΕ ΒΑΣΗ ΤΗ ΘΕΣΗ ΤΟΥ ΧΡΗΣΤΗ
1.4.1 Εισαγωγή στις υπηρεσίες εντοπισμού θέσης
Η ένωση του διαδικτύου και του κινητού τηλεφώνου έγιναν η αιτία για την
μεγάλη αύξηση στην αγορά των φορητών συσκευών. Έτσι οι δύο αυτές
τεχνολογίες υπόσχονται στο κοινό ακόμα περισσότερες υπηρεσίες. Για
παράδειγμα, η γνώση της θέσης του χρήστη αποκτά όλο και μεγαλύτερο
ενδιαφέρον για τους παρόχους κινητής τηλεφωνίας. Φυσικά αυτή η ιδέα υπήρχε
από παλιά με τις υπηρεσίες εντοπισμού θέσης ενός οχήματος. Η τελειοποίηση
των υπηρεσιών με βάση τη γεωγραφική θέση έδωσε το έναυσμα στην αγορά
για
πολλούς
χρήστες.
Τα
τελευταία
χρόνια
έχουμε
την
πλήρη
8
εμπορευματοποίηση των LBS με μια πληθώρα εμπορικών υπηρεσιών και
εφαρμογών με βάση την τοποθεσία και πληροφορίες που αφορούν την
περιοχή. [2],[4],[5]
1.4.2 Σημαντικά χαρακτηριστικά
Οι εξελίξεις στις τηλεπικοινωνίες και στις τεχνολογίες πληροφόρησης,
καθιστούν αναγκαία την ανάπτυξη υψηλής ποιότητας υπηρεσιών που
βασίζονται στη γεωγραφική θέση των χρηστών που τις χρησιμοποιούν (LBS:
Location Based Services). Οι θέσεις από τις οποίες διέρχεται κάθε χρήστης
συλλέγονται από ειδικά συστήματα (GPS) που είναι ενσωματωμένα σε
διάφορες συσκευές (κινητά τηλέφωνα, PDAs, GPS devices). Όταν ένας χρήστης
ζητά την παροχή κάποιας LBS υπηρεσίας, στέλνει μέσω της συσκευής του την
τρέχουσα θέση του σε έναν απομακρυσμένο παροχέα της υπηρεσίας, που
βρίσκεται εγκατεστημένος στον τηλεπικοινωνιακό φορέα στον οποίο είναι
εγγεγραμμένος ο χρήστης. Για να υπάρξει μια σωστή τεχνολογία LBS πρέπει να
πληρούνται κάποιοι παράγοντες για τον εντοπισμό θέσης και αυτοί είναι οι εξής:
-
Συντεταγμένες ακρίβειας που καθορίζονται από την αρμόδια υπηρεσία
-
Όσο το δυνατό χαμηλότερο κόστος
-
Ελάχιστες επιπτώσεις στον εξοπλισμό και στο δίκτυο
Επίσης υπάρχουν κάποιες απαιτήσεις όπου κάνουν μια εφαρμογή LBS
εκμεταλλεύσιμη από το κοινό και αυτές είναι οι εξής:
-
Ελάχιστη χρήση του δικτύου του παρόχου για απόκτηση πληροφοριών
-
Απλό γραφικό περιβάλλον για τον χρήστη
-
Χρήση διαθέσιμων διαδικτυακών υπηρεσιών
-
Υψηλή διαθεσιμότητα των υπηρεσιών ακόμα και σε περιόδους υψηλής
ζήτησης
-
Εξελιξιμότητα
-
Χαμηλό κόστος
Τέλος υπάρχουν και οι περιπτώσεις που οι εφαρμογές LBS αναφέρονται σε
περιοχές ενός κτιρίων τότε πρέπει να πληρούνται τα παρακάτω:
-
Ελάχιστη γραφική αλληλεπίδραση
-
Εύκολη καθοδήγηση μέσω του φυλλομετρητή
-
Υποστήριξη προσανατολισμού στο χώρο
9
1.4.3 ∆ομικά μέρη υπηρεσιών με βάση τη γεωγραφική θέση χρήστη
Τα δομικά μέρη που αποτελούν ένα πλήρες σύστημα βασιζόμενο στη
γεωγραφική θέση του χρήστη είναι τα εξής:
1) Κινητό τερματικό: Η συσκευή όπου ο χρήστης ζητάει τις πληροφορίες που
χρειάζεται. Οι πληροφορίες αυτές είναι είτε με τη μορφή συνδυασμού
εικόνας και κειμένου είτε με τη μορφή λόγου.
2) ∆ίκτυο επικοινωνίας: Είναι το δίκτυο κινητής τηλεφωνίας όπου μεσολαβεί
για μεταφερθούν οι αιτήσεις του χρήστη από το κινητό τερματικό στον
εξυπηρετητή και στην πορεία από τον εξυπηρετητή στο τερματικό.
3) Σύστημα εύρεσης θέσης: Θα πρέπει να υπάρχει ένας τρόπος για να
βρίσκουμε τις γεωγραφικές συντεταγμένες του τερματικού για να είναι
δυνατή η παροχή πληροφοριών που έχουν σχέση με τη γεωγραφική θέση
του χρήστη. Αυτό επιτυγχάνεται με τη χρήση κάποιων συστημάτων
δορυφορικής πλοήγησης όπως το GPS και άλλα.
4) Πάροχος υπηρεσιών: Είναι υπεύθυνος για την επεξεργασία των αιτήσεων
και παρέχει πολλέ υπηρεσίες στο χρήστη. Αυτές οι υπηρεσίες απαιτούν την
εύρεση μιας διαδρομής, τη δυνατότητα υπολογισμού της θέσης κλπ.
5) Πάροχοι δεδομένων: Έχουν την δυνατότητα να κρατούν χρήσιμες
πληροφορίες και δεδομένα που ο πάροχος υπηρεσιών δεν μπορεί να
διατηρήσει. Συνεπώς τα διατηρεί ο πάροχος δεδομένων και ο πάροχος
υπηρεσιών έχει πρόσβαση σε αυτά κάθε φορά που πρέπει να εξυπηρετήσει
τις αιτήσεις του χρήστη.
Εικόνα 1-2:Τα βασικά συστατικά μιας υπηρεσίας LBS [4]
10
1.4.4 Αρχιτεκτονική μίας υπηρεσίας βασισμένης στη γεωγραφική θέση
του χρήστη
Οι LBS δεν χρειάζονται απλώς χαρακτηριστικά δεδομένα αλλά και
χωρικά δεδομένα, διαφέρουν από τις συνηθισμένες ασύρματες εφαρμογές.
Παρέχουν υπηρεσίες βασιζόμενες στη γεωγραφική θέση του χρήστη σε
κινητούς χρήστες και απεικονίζουν χωρικές πληροφορίες στην οθόνη με την
μορφή χαρτών.
Οι υπηρεσίες τοποθεσίας (Location Services) παρέχουν την πληροφορία
για την τοποθεσία σχετικά με ένα αντικείμενο. Επειδή τα δεδομένα που
παρέχουν οι LBS βασίζονται στις LBS, τα αποτελέσματα που παράγονται από
τις LBS εξαρτώνται από την τοποθεσία και την ώρα μιας συγκεκριμένης
συσκευής. Η βασική αρχιτεκτονική του LBS φαίνεται στην παρακάτω εικόνα.
Εικόνα 1-3: Βασική αρχιτεκτονική μιας υπηρεσίας LBS [4]
Το geocoding είναι η ανάθεση συντεταγμένων θέσης σε κάποιο σημείο
ενδιαφέροντος με βάση μια διεύθυνση. Ο στόχος είναι να δοθεί μια λίστα με
11
υποψήφιες θέσεις που η γεωγραφική τους τοποθεσία είναι αρκετά κοντά στην
γεωγραφική τοποθεσία της δοθείσας διεύθυνσης. Είναι εφικτό να υποδειχθεί ο
αριθμός των σημείων που ταιριάζουν στην απόκριση για μια συγκεκριμένη
διεύθυνση που εμπεριεχόταν στο αίτημα geocoding. Το geocoding μετατρέπει
συνηθισμένες εγγραφές δεδομένων που περιέχουν διευθύνσεις σε γεωγραφικά
αντικείμενα που μπορούν να προβληθούν σε ένα χάρτη. Αυτό γίνεται με το
ταίριασμα μιας διεύθυνσης στόχου ή της ονομασίας ενός μέρους σε σύγκριση
με τα αρχεία μιας περιεκτικής βάσης δεδομένων που περιέχει διευθύνσεις και
ονόματα σημείων, με την επιστροφή στο τέλος των συντεταγμένων που έχουν
σχέση με την διεύθυνση που ταιριάζει.
Για παράδειγμα, όταν τα δεδομένα γίνουν geocoded μπορούν να
προβληθούν οδηγίες πλοήγησης μεταξύ δύο διευθύνσεων (τοποθεσιών). Είναι
επίσης δυνατό να εκτελεστεί μια ευρεία γκάμα λειτουργιών όπως το query και το
find, και να αναλυθούν τα δεδομένα σε γεωγραφικούς όρους.
Στο reverse geocoding η διεύθυνση μπορεί να βρεθεί με βάση τις
συντεταγμένες της τοποθεσίας του. Η υπηρεσία βασιζόμενη στη γεωγραφική
θέση του χρήστη στέλνει query στην υπηρεσία θέσης για να μάθει για τις
γεωγραφικές τοποθεσίες των στόχων της.
1.5 ΤΕΧΝΟΛΟΓΙΑ ΑΝΙΧΝΕΥΣΗΣ ΘΕΣΗΣ GPS
1.5.1 Εισαγωγή
Ο προσδιορισμός της θέσης αποτέλεσε έναν πρωταρχικό σκοπό των
δραστηριοτήτων
(οικονομικών,
επιστημονικών,
κοινωνικών,
κ.α.)
του
ανθρώπου. Για το σκοπό αυτό, κατά το πέρασμα των αιώνων, επινοήθηκαν και
εφαρμόστηκαν διάφοροι μέθοδοι προσδιορισμού θέσης.
Το GPS (Global Positioning System) είναι ένα παγκόσμιο σύστημα
εντοπισμού θέσης, το οποίο για την λειτουργία του χρησιμοποιεί ένα σύνολο 24
δορυφόρων οι οποίοι μεταδίδουν ακριβή σήματα μικροκυμάτων τα οποία
επιτρέπουν στους δέκτες GPS να καθορίσουν την τρέχουσα θέση τους, την
τρέχουσα ώρα και την τρέχουσα ταυτότητα τους. Ένας δέκτης GPS υπολογίζει
την τρέχουσα θέση του μετρώντας προσεκτικά τους χρόνους αφίξεων των
σημάτων τα οποία στέλνονται από τους GPS δορυφόρους.
12
Κάθε
δορυφόρος
μεταδίδει
διαρκώς
μηνύματα
που
περιέχουν
πληροφορία για την ακριβή ώρα αποστολής του μηνύματος, για την ακριβή
θέση του την στιγμή της αποστολής, για την συνολική κατάσταση του
συστήματος και για τις τροχιές όλων των υπόλοιπων δορυφόρων. Ο δέκτης
μετράει τον χρόνο που χρειάζεται κάθε σήμα να φτάσει σε αυτόν και υπολογίζει
την απόσταση του από κάθε δορυφόρο. Για να προσδιοριστεί η ακριβής θέση
του δέκτη συνδυάζονται οι μετρούμενες αποστάσεις με τις θέσεις των
δορυφόρων με την γεωμετρική μέθοδο της τριγωνοποίησης.
1.5.2 Η δομή του GPS
Το GPS [9] αποτελείται από τρία βασικά λειτουργικά τμήματα. Αυτά είναι
το ∆ιαστημικό τμήμα, το Επίγειο τμήμα ελέγχου και το τμήμα τελικού χρήστη.
Το ∆ιαστημικό τμήμα
Το τμήμα διαστήματος αποτελείται από 24 δορυφόρους. Οι δορυφόροι αυτοί
περιφέρονται γύρω από τη γη, με ακτίνα περιστροφής 26.600km και
ολοκληρώνουν δύο περιφορές σε μια αστρική ημέρα. Τα τροχιακά επίπεδα των
δορυφόρων έχουν κέντρο την γη και δεν περιστρέφονται σε σχέση με τους
απλανείς αστέρες. Οι τροχιές αυτές είναι διαμορφωμένες έτσι ώστε να είναι
ορατοί τουλάχιστον 6 δορυφόροι από οποιοδήποτε σχεδόν σημείο της γης. Τον
Μάρτιο του 2008 προστέθηκαν άλλοι 7 δορυφόροι ώστε να βελτιωθεί η ακρίβεια
των υπολογισμών. Με την αύξηση των δορυφόρων άλλαξαν και οι τροχιές τους
σε μια ανομοιόμορφη διάταξη έτσι ώστε να βελτιωθεί η αξιοπιστία και η
διαθεσιμότητα του συστήματος.
Εικόνα 1-4: Τμήμα διαστήματος [9]
13
Το Επίγειο τμήμα ελέγχου
Το τμήμα ελέγχου παρακολουθεί, ενημερώνει και κατευθύνει τη λειτουργία κάθε
δορυφόρου του συστήματος. Αποτελείται από ένα σύνολο σταθμών και κεραιών
μέσω τον οποίων ελέγχεται η ορθή λειτουργία του συστήματος. Οι τροχιές των
δορυφόρων
ελέγχονται
από
τις
Ηνωμένες
Πολιτείες
μέσω
σταθμών
παρακολούθησης. Οι σταθμοί παρακολούθησης βρίσκονται στις περιοχές:
Κολοράντο (ΗΠΑ), Χαβάη (Ανατολικός Ειρηνικός Ωκεανός), Ascension Island
(Ατλαντικός Ωκεανός), Diego Garcia (Ινδικός Ωκεανός), Kwajalein (∆υτικός
Ειρηνικός Ωκεανός). Όλες οι πληροφορίες ανίχνευσης των δορυφόρων
στέλνονται στον κεντρικό σταθμό ελέγχου. Ο κεντρικός σταθμός επικοινωνεί με
κάθε δορυφόρο σε τακτά χρονικά διαστήματα στέλνοντας διορθώσεις στους
δορυφόρους.
Εικόνα 1-5: Τμήμα ελέγχου [9]
Το τμήμα τελικού χρήστη
Το τμήμα των χρηστών περιλαμβάνει τους δέκτες GPS οι οποίοι λαμβάνουν,
επεξεργάζονται τα σήματα και καταγράφουν τις μετρήσεις. Ο δέκτης αποτελείται
από την κεραία, τον κυρίως δέκτη και τον υπολογιστή. Μέσω της κεραίας
μπορεί να συντονίζεται σε σημεία για τον προσδιορισμό της θέσης τους. Ο
σχεδιασμός των τροχιών είναι τέτοιος, ώστε ανά πάσα χρονική στιγμή και σε
οποιοδήποτε σημείο της γης, να υπάρχουν τουλάχιστον 4 ορατοί δορυφόροι
που να λαμβάνονται ταυτόχρονα.
14
1.6.1 GALILEO
Το Galileo είναι ένα παγκόσμιο δορυφορικό σύστημα πλοήγησης που
κατασκευάστηκε
από την Ευρωπαϊκή Ένωση (ΕΕ) και την Ευρωπαϊκή
Υπηρεσία ∆ιαστήματος (ESA). Έχει πάρει το όνομά του από τον Ιταλό
αστρονόμο Galileo Galilei . Ένας από τους στόχους του Galileo είναι να
προσφέρει ένα υψηλής ακρίβειας σύστημα εντοπισμού θέσης κατά την οποία τα
ευρωπαϊκά έθνη μπορούν να βασίζονται, ανεξάρτητα από τα συστήματα
πλοήγησης, όπως το ρωσικό GLONASS, το αμερικάνικο GPS, και τo κινέζικο
BeiDou (COMPASS), τα οποία μπορούν να απενεργοποιηθούν σε καιρό
πολέμου ή συγκρούσεων.
Στις 21 Οκτωβρίου 2011 ξεκίνησε η φάση της επικύρωσης του
συστήματος σε τροχιά (In-Orbit Validation (IOV)) με την επιτυχή εκτόξευση και
λειτουργία των δύο πρώτων δορυφόρων του συστήματος, κι ένα χρόνο
αργότερα, στις 12 Οκτωβρίου 2012 ολοκληρώθηκε η επιτυχής εκτόξευση των
δύο επόμενων δορυφόρων. Στα μέσα της τρέχουσας δεκαετίας αναμένεται η
ενεργοποίηση της λειτουργίας του συστήματος (Initial Operational Capability
(IOC)) .Η πλήρης ολοκλήρωση του συστήματος Galileo αναμένεται έως το 2019
με συνολικά 30 δορυφόρους σε τροχιά.
Το Galileo έχει ως στόχο να παρέχει ακρίβεια και καλύτερες υπηρεσίες
εντοπισμού θέσης σε υψηλά γεωγραφικά πλάτη σε σχέση με άλλα συστήματα
εντοπισμού θέσης. Ένα επιπλέον χαρακτηριστικό, το Galileo θα προσφέρει μια
μοναδική παγκόσμια υπηρεσία για Έρευνα και ∆ιάσωση (Search and Rescue
(SAR)). Οι δορυφόροι θα είναι εξοπλισμένο με έναν αναμεταδότη που θα
αναμεταδίδει σήματα κινδύνου από τον πομπό του χρήστη στο Κέντρο
∆ιάσωσης Συντονισμού, η οποία θα ξεκινήσει μετά την επιχείρηση διάσωσης.
Ταυτόχρονα, το σύστημα θα παρέχει ένα σήμα στον χρήστη, πληροφορώντας
τους ότι η κατάστασή του έχει ανιχνευθεί και ότι η βοήθεια είναι στο δρόμο. Αυτό
το τελευταίο χαρακτηριστικό είναι νέο και θεωρείται μια σημαντική αναβάθμιση
σε σχέση με τα υπάρχοντα συστήματα πλοήγησης GPS και GLONASS, τα
οποία δεν παρέχουν ανατροφοδότηση στο χρήστη.
Η χρήση των βασικών υπηρεσιών Galileo θα είναι ελεύθερη και ανοικτή
για τον καθένα. Με την τοποθέτηση δορυφόρων σε τροχιά σε μια μεγαλύτερη
κλίση ως προς τη γραμμή του Ισημερινού σε σχέση με το GPS, επιτρέπει στο
Galileo να έχει καλύτερη κάλυψη σε υψηλά γεωγραφικά πλάτη. Αυτό θα το
15
καταστήσει ιδιαίτερα κατάλληλο για λειτουργία πάνω από τη Βόρεια Ευρώπη,
μια περιοχή που δεν καλύπτεται επαρκώς από το GPS. Η Ευρώπη θα είναι σε
θέση να εκμεταλλευτεί τις ευκαιρίες που παρέχονται από τη δορυφορική
πλοήγηση σε όλη την έκταση της. Πάροχοι εφαρμογών και φορείς παροχής
υπηρεσιών θα επωφεληθούν από νέες επιχειρηματικές ευκαιρίες.
16
ΚΕΦΑΛΑΙΟ 2. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΕ ΠΕΡΙΒΑΛΛΟΝ
ANDROID
2.1 ΕΙΣΑΓΩΓΗ
Το Android αποτελεί ένα λειτουργικό σύστημα το οποίο χρησιμοποιείται
τα τελευταία χρόνια σε μεγάλο αριθμό έξυπνων κινητών τηλεφώνων
(smartphones), καθώς και σε ηλεκτρονικές ταμπλέτες (Tablet PCs). Οι
λειτουργίες του κινητού τηλεφώνου ελέγχονται από διάφορες εφαρμογές
(applications) τις οποίες οι χρήστες μπορούν να κατεβάσουν και να
εγκαταστήσουν ελεύθερα.
Είναι σημαντικό ότι το Android αποτελεί ελεύθερο λογισμικό ανοιχτού
κώδικα και αυτό σημαίνει ότι οι κατασκευαστές κινητών τηλεφώνων ή άλλων
ηλεκτρονικών συσκευών μπορούν να το χρησιμοποιήσουν στα προϊόντα τους
ελεύθερα και χωρίς κόστος. Αυτό αποτέλεσε καταλύτη στη διάδοση του
λειτουργικού αυτού συστήματος. Επίσης τα προγραμματιστικά εργαλεία για την
ανάπτυξη εφαρμογών σε πλατφόρμα Android υπάρχουν ελεύθερα στο
διαδίκτυο.
Ακολουθεί
μία
σύντομη
περιγραφή
των
κυριότερων
προγραμματιστικών εργαλείων καθώς και μία ανάλυση των βασικών στοιχείων
που αφορούν στην ανάπτυξη εφαρμογών σε λειτουργικό σύστημα Android.
2.2 ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΑ ΕΡΓΑΛΕΙΑ
Η γλώσσα προγραμματισμού που χρησιμοποιείται για την κατασκευή
εφαρμογών Android είναι η Java. Άρα βασική προϋπόθεση της κατασκευής
είναι να διαθέτουμε τα αντίστοιχα εργαλεία της γλώσσας προγραμματισμού που
θα χρησιμοποιήσουμε και πιο συγκεκριμένα το Java Development Kit (JDK)
[2][5][6].
Επίσης
χρειαζόμαστε
ένα
περιβάλλον
ανάπτυξης
(Integrated
Development Environment, IDE) για να μεταγλωττίζουμε και να τρέχουμε τα
προγραμματά μας όπως το Eclipse (Εικόνα 2-1). [2],[5],[6]
Το πιο βασικό εργαλείο είναι το Android SDK (software development kit)
το οποίο μας παρέχει τα επιπλέον εργαλεία ώστε να μπορούμε να γράψουμε
κώδικα συγκεκριμένα για την κατασκευή εφαρμογής Android. Η σύνδεση του
Android SDK με το γραφικό μας περιβάλλον Eclipse γίνεται μέσω μιας
επέκτασης (Android Development Tools ή ADT Plugin) που εγκαθιστάμε στο
17
Eclipse ώστε να μπορέσουμε να μεταγλωττίσουμε την εφαρμογή μας και μετά
να την τρέξουμε. [2],[5],[6]
Για να δοκιμάσουμε την εφαρμογή μας και να δούμε τα αποτελέματά της
θα χρειαστούμε κάποιον προσομοιωτή κινητού τηλεφώνου στον υπολογιστή
μας. Υπάρχει λοιπόν μία εικονική συσκευή Android (Android Virtual Device ή
AVD) η οποία αποτελεί προσομοιωτή τόσο software όσο και hardware ενός
κινητού τηλεφώνου με λειτουργικό σύστημα Android (Εικόνα 2-2). Αυτή τη
συσκευή την εγκαθιστάμε μέσα από την ADT Plugin, όπου μπορούμε να
ρυθμίσουμε πολλές παραμέτρους της, όπως την έκδοση Android που θα
χρησιμοποιεί, το μέγεθος της κάρτας SD και της cache, καθώς και άλλα
χαρακτηριστικά όπως του δέκτη GPS κλπ. Φυσικά μπορούμε να δοκιμάσουμε
την εφαρμογή μας και σε φυσική συσκευή, όπως το κινητό τηλέφωνο ή tablet
pc, που να χρησιμοποιεί το λειτουργικό σύστημα Android.
Τέλος, πρέπει να επισημάνουμε ότι όλα τα παραπάνω προγραμματιστικά
εργαλεία υπάρχουν ελεύθερα στο διαδίκτυο από τους κατασκευαστές τους
όπου μπορούμε να τα κατεβάσουμε και να τα χρησιμοποιήσουμε χωρίς κανένα
κόστος.
Εικόνα 2-1: Το περιβάλλον ανάπτυξης λογισμικού Eclipse
18
Εικόνα 2-2: Εικονική συσκευή με λειτουργικό σύστημα Android (AVD)
2.3 ΣΥΣΤΑΤΙΚΑ ΣΤΟΙΧΕΙΑ ANDROID ΕΦΑΡΜΟΓΗΣ
Η κάθε εφαρμογή Android περιέχει κάποια απαραίτητα δομικά στοιχεία.
Το κάθε στοιχείο από αυτά είναι ένας τρόπος πρόσβασης του λειτουργικού
συστήματος στην εφαρμογή μας.
Τα διακρίνουμε σε τέσσερα βασικά στοιχεία: τις δραστηριότητες
(activities), τις υπηρεσίες (services), τους παρόχους περιεχομένου (content
providers) και τους παραλήπτες μηνυμάτων (broadcast receivers).
19
2.3.1 Activities
Αποτελούν το βασικότερο στοιχείο κάθε εφαρμογής. Η κάθε μία
δραστηριότητα (activity) αποτελεί μία διαφορετική οθόνη (παράθυρο) της
εφαρμογής μας, με την οποία ο χρήστης αλληλεπιδρά. Σε αυτή φορτώνεται το
γραφικό περιβάλλον το οποίο βλέπει ο χρήστης.
Κάθε εφαρμογή αποτελείται συνήθως από αρκετές activities, οι οποίες
συνδέονται μεταξύ τους, δηλαδή κάθε activity μπορεί να καλέσει κάποια άλλη.
Η πρώτη οθόνη που θα δει ο χρήστης όταν τρέξει την εφαρμογή αποτελεί την
κεντρική (main) activity, από την οποία προέρχονται όλες οι υπόλοιπες. Τη
στιγμή που η εφαρμογή μας καλεί νέα activity, ο χρήστης βλέπει τη νέα οθόνη
και με το πλήκτρο back μπορεί να επιστρέψει στην προηγούμενη, είναι σαν να
έχουμε μια μορφή στοίβας (LIFO).
Για παράδειγμα μια απλή εφαρμογή ενός ηλεκτρονικού ταχυδρομείου, η
οποία μόλις ανοίγει εμφανίζει 3 επιλογές: Inbox, Compose, Sent Mail. Η
υλοποίηση αυτής της εφαρμογής είναι να δημιουργήσουμε 5 διαφορετικές
οθόνες, δηλαδή 5 activities:
1) Η Main activity που εμφανίζει τις επιλογές,
2) Inbox, η λίστα με τα εισερχόμενα μηνύματα,
3) ReadMail, η οθόνη που διαβάζουμε ένα mail,
4) Compose η οθόνη που γράφουμε ένα email για να το στείλουμε και
5) SentMail, η λίστα με τα εξερχόμενα μηνύματά μας.
Κάθε activity υλοποιεί τη μέθοδο onCreate() η οποία καλείται τη στιγμή
που ξεκινάει η activity. Επίσης μέσα στη μέθοδο αυτή πρέπει να δημιουργηθεί η
διεπαφή χρήστη (User Interface ή UI), η οποία δηλώνεται με την εντολή
setContentView() και η findViewById() για να ανακτήσει τα διάφορα widgets
προγραμματιστικά. (Το UI περιγράφεται σε επόμενη παράγραφο).
Για να ξεκινήσουμε μια activity B μέσα από μία
activity A
χρησιμοποιούμε τις παρακάτω εντολές: Intent intent = new Intent (this,
MyActivityB.class); startActivity(intent); Ενώ για να τερματίσουμε μία activity,
αρκεί η εντολή finish(). Το Android διαχειρίζεται τον κύκλο ζωής της κάθε
activity, οπότε δεν χρειάζεται να τις τερματίσουμε εμείς. Ο κύκλος ζωής και οι
αντίστοιχες μέθοδοι των activities φαίνονται στην (Eικόνα 2-3).
20
Εικόνα 2-3: Ο κύκλος ζωής των activities και οι αντίστοιχες μέθοδοι [18],[19]
2.3.2 Services
Οι υπηρεσίες (services) είναι σχεδιασμένες να εκτελούνται διαρκώς
ανεξάρτητα και από κάποιο Activity εφόσον χρειαστεί. Η διαφορά με την activity
είναι ότι η service δεν παρέχει περιβάλλον διεπαφής χρήστη (user interface).
Επίσης, η service μπορεί να εκτελείται ακόμα και όταν τρέξουμε κάποια
διαφορετική εφαρμογή από αυτήν που την ξεκίνησε.
21
Η εφαρμογή για αναπαραγωγή μουσικής αποτελεί τέτοιο παράδειγμα
υπηρεσίας. ∆ηλαδή, όταν ακούμε μουσική και θέλουμε να τρέξουμε και μία άλλη
εφαρμογή θέλουμε να συνεχίσουμε να ακούμε μουσική και δίχως κάποιο
γραφικό περιβάλλον για την αναπαραγωγή. Επιπλέον όλη η επικοινωνία με το
δίκτυο θέλουμε να συνεχίσει όταν ανοίξουμε κάποια εφαρμογή και να μην
σταματήσει επομένως θα πρέπει να λειτουργήσει σαν service.
∆ύο είναι οι βασικές λειτουργίες που σχετίζονται με τις υπηρεσίες: η
startService() και η bindService(). H startService() καλείται από κάποια activity
για να ξεκινήσει η service και θα συνεχίσει να εκτελείται ακόμα και αν η activity
που την κάλεσε τερματιστεί. Για αυτό η service δεν επιστρέφει κάποιο
αποτέλεσμα στην activity που την κάλεσε αλλά εκτελεί κάποια λειτουργία όπως
το κατέβασμα κάποιου αρχείου από το διαδίκτυο. Η bindService() «δένει» τη
service με κάποιο άλλο στοιχείο της εφαρμογής, όπως με μία activity, έτσι ώστε
να υπάρχει αλληλεπίδραση μεταξύ των στοιχείων αυτών, όπως η αποστολή και
λήψη αποτελεσμάτων. Έτσι αν τερματιστεί η activity τερματίζεται και η service.
Η service είπαμε πως δεν παρέχει διεπαφή χρήστη άρα για τα
αποτελέσματα της υπηρεσίας ενημερωνόμαστε με δυο τρόπους: η ειδοποίηση
Toast και η ειδοποίηση μέσω Status Bar. (Αυτά θα αναλυθούν σε επόμενη
παράγραφο διότι αφορούν στο user interface).
Το λειτουργικό σύστημα δεν διαχειρίζεται τον κύκλο ζωής των services
επομένως η κάθε service θα πρέπει να δηλώνει το πότε θα σταματήσει με την
εντολή stopSelf().
2.3.3 Content Providers
Οι
πάροχοι
περιεχομένου
(Content
Providers)
διαχειρίζονται
αποθηκευτικούς χώρους για δεδομένα οι οποιοι είναι προσπελάσιμοι από
οποιαδήποτε
εφαρμογή.
Για
παράδειγμα
μία
εφαρμογή
τηλεφωνικού
καταλόγου, θα θέλαμε να αποθηκεύει σε συγκεκριμένο χώρο τις επαφές μας,
ώστε να μπορούμε να τις χρησιμοποιήσουμε σε διαφορετική εφαρμογή και να
μπορεί να εντοπίσει και να επεξεργαστεί τα ήδη υπάρχοντα δεδομένα.
Υπάρχει ενσωματωμένη βάση δεδομένων στο λειτουργικό σύστημα
Android (SQLite database), στην οποία μπορούν να αποθηκεύουν ή να
διαβάζουν δεδομένα οι Content Providers.
22
2.3.4 Broadcast Receivers
Οι Broadcast Receivers ενημερώνονται για κάποιο συγκεκριμένο
γεγονός από το λειτουργικό σύστημα και τότε ενεργοποιούνται. ∆ιάφορα
συμβάντα όπως ότι έχει σβήσει η οθόνη, ότι η στάθμη της μπαταρίας είναι
χαμηλή κλπ.
Ένα παράδειγμα, είναι οι εφαρμογές λήψης φωτογραφιών όπου
απενεργοποιούν το flash για εξοικονόμηση ενέργειας σε περίπτωση χαμηλής
μπαταρίας εφόσον έχουν ενημερωθεί από τον Broadcast Receiver. Οι
Broadcast Receivers δεν παρέχουν user interface, αλλά ενημερώνουν το
χρήστη για κάποια ενέργεια μέσω των status bar notifications.
2.4 USER INTERFACE
Η διεπαφή χρήστη έχει τεράστια σημασία για κάθε εφαρμογή. Είναι η
τελική εικόνα που βλέπει ο χρήστης, το γραφικό περιβάλλον στο οποίο θα
περιηγείται και ενεργοποιεί όλες τις λειτουργίες της εφαρμογής. Οι διεπαφές
χρήστη στο Android μπορούν να χτιστούν με δύο τρόπους:
¾ με τον καθορισμό κώδικα XML και
¾ με κώδικα Java.
Ο καθορισμός δομής σε XML είναι προτιμότερος διότι η διεπαφή χρήστη
πρέπει να ξεχωρίζει από την λογική του προγράμματος σύμφωνα μα την αρχή
του Μοντέλο-Θεατή-Έλεγχος(Model-Viewer-Control).
Ο καθορισμός ενός UI σε XML είναι παρόμοιος με την δημιουργία ενός
κοινού HTML-εγγράφου όπως για παράδειγμα:
<html>
<head>
<title> Page Title </title>
</head>
<body>
Το περιεχόμενο του στοιχείου σώματος.
</body>
</html>
23
Όλα είναι ακριβώς δομημένα και μπορούν να εκφραστούν από δεντρικές
δομές, όπως ακριβώς στα XML-σχεδιαγράμματα του Android.
<? XML version =”1.0” encoding = “utf-8”?>
<LinearLayout
xmlns: android= http://schemas.android.com/apk/res/android
android: orientation=”verical”
android: layout_width=”fill_parent”
android: layout_height=”fill_parent”>
<TextView
android: layout_width=”wrap_content”
android: layout_height=”wrap_content”
android: text=”Hello World”/>
</LinearLayout>
2.4.1 Layout
Σε κάθε οθόνη της εφαρμογής πρωταρχικό στοιχείο του γραφικού
περιβάλλοντος αποτελεί η διάταξη των γραφικών στοιχείων ή layout. Το layout
περιλαμβάνει όλα τα γραφικά στοιχεία της οθόνης τα οποία μπορεί να είναι
διατεταγμένα σε επιμέρους layouts. Υπάρχουν 4 είδη layout:
¾ LinearLayout (γραμμική διάταξη),
¾ RelativeLayout (σχετική διάταξη),
¾ FrameLayout (διάταξη πλαισίου)
¾ TabletLayout (διάταξη πίνακα).
Το LinearLayout αποτελεί διάταξη στοιχείων σε οριζόντια ή κατακόρυφη
σειρά. Αν δηλώσουμε τρία στοιχεία A,B,C σε ένα οριζόντιο LinearLayout τότε τα
στοιχεία αυτά θα εμφανίζονται στην οθόνη σε μία οριζόντια διάταξη με τη σειρά
που τα δηλώσαμε το ένα δίπλα στο άλλο.
Το RelativeLayout μας δίνει περισσότερη ελευθερία στη δήλωση των
γραφικών στοιχείων δηλαδή κάθε στοιχείο μπορούμε να επιλέξουμε να το
εμφανίσουμε σε συγκεκριμένο σημείο της οθόνης.
24
Το FrameLayout αποτελεί την απλούστερη διάταξη στοιχείων. Είναι ένας
κενός χώρος τον οποίο μπορούμε να γεμίσουμε με κάποιο αντικείμενο όπως με
μία εικόνα.
Το TabletLayout αποτελεί διάταξη πίνακα σε σειρές και στήλες.
Υπάρχουν δύο τρόποι να δηλώσουμε τα layouts:
α) μέσω αρχείων XML ή
β) μέσα στις activities της εφαρμογής μας.
Τα αρχεία XML αποτελούν στατικό τρόπο δημιουργίας των γραφικών
στοιχείων. Τα αποθηκεύουμε σε συγκεκριμένο φάκελο στο project μας και τα
καλούμε για δημιουργία του γραφικού περιβάλλοντος μέσα από τις activities.
Υπάρχουν όμως και οι περιπτώσεις που δεν γνωρίζουμε εξαρχής τη διάταξη
που θα χρησιμοποιήσουμε οπότε δημιουργούμε δυναμικά layouts μέσα στις
activities και ορίζουμε εκεί τις παραμέτρους αυτών.
2.4.2 Μενού
Τα μενού αποτελούν ένα σημαντικό κομμάτι της διεπαφής χρήστη για
κάθε οθόνη της εφαρμογής, διότι παρέχουν στο χρήστη ένα γνωστό τρόπο για
να εισάγει τις επιλογές του. Στο λειτουργικό σύστημα Android υπάρχουν τρία
διαφορετικά είδη μενού: το μενού επιλογών (options menu), το μενού πλαισίου
(context menu), το υπομενού (submenu) και τα τρία δηλώνονται σε αρχεία xml.
2.4.2.1 Options Menu
Αποτελεί το πιο βασικό μενού μιας εφαρμογής. Περιέχει όλες τις βασικές
επιλογές της εφαρμογής μας και εμφανίζεται την στιγμή που πατάμε το κουμπί
μενού του κινητού μας. Αποτελεί τον τρόπο όπου περιηγούμαστε μεταξύ των
διαφορετικών οθονών και activities της εφαρμογής μας.
2.4.2.2 Context Menu
Το
context
menu έρχεται
να
μας
δώσει
την
λύση
ώστε
να
χρησιμοποιήσουμε και στις εφαρμογές Android την επιλογή του δεξί κλίκ που
μας
δίνετε
σε
διάφορα
προγράμματα.
Περιλαμβάνει
τις
επιλογές
σε
οποιοδήποτε γραφικό στοιχείο το ορίσουμε (εικόνα, κείμενο, κλπ) και
ενεργοποιείται από το χρήστη με παρατεταμένο πάτημα (press and hold ή long
press) του στοιχείου αυτού. Για παράδειγμα, στο context menu ενός κειμένου
25
θα ορίζαμε τις επιλογές «αντιγραφή», «αποκοπή», «επικόλληση», ενώ στο
context menu μιας διεύθυνσης URL σε εφαρμογή web browser θα ορίζαμε τις
επιλογές «μετάβαση», «ανανέωση», «διακοπή»,κλπ.
2.4.2.3 Submenu
Το submenu προστίθεται σαν επιλογή στα δύο πιο πάνω menu και
ανοίγει ένα επιπλέον μενού για περισσότερες επιλογές. Τη χρησιμοποιούμε σε
περιπτώσεις όπου η εφαρμογή μας εκτελεί πολλές λειτουργίες και θέλουμε να
τις οργανώσουμε σε μενού.
2.4.3 Dialogs
O dialog είναι συνήθως ένα μικρό παράθυρο που εμφανίζεται στην
οθόνη μπροστά από την activity που την κάλεσε. Το παράθυρο του διαλόγου
είναι το μοναδικό με το οποίο μπορεί να αλληλεπιδράσει ο χρήστης.
Χρησιμοποιείται είτε για να ορίσει ο χρήστης κάποια επιλογή του είτε για
ενημέρωση του χρήστη για κάποιο γεγονός. Τα δύο πιο σημαντικά είδη
διαλόγων είναι: ο AlertDialog (διάλογος ειδοποίησης) και ο ProgressDialog
(διάλογος προόδου).
O AlertDialog αποτελείται από ένα τίτλο, ένα μήνυμα και ορισμένα
κουμπιά ή μία λίστα από επιλογές. Για κάθε κουμπί του διαλόγου ορίζουμε μέσα
στην activity τις ενέργειες που θα ακολουθήσουν όταν το πατήσει ο χρήστης.
Ο ProgressDialog αποτελεί επέκταση του AlertDialog και χρησιμοποιείται
όταν θέλουμε να εμφανίσουμε στο χρήστη την πρόοδο για κάποια ενέργεια. Για
παράδειγμα όταν θέλουμε να κατεβάσουμε κάποιες εικόνες από το διαδίκτυο θα
χρειαστούμε κάποιο χρονικό διάστημα για να ολοκληρωθεί αυτή η ενέργεια. Για
να μην βλέπει λοιπόν ο χρήστης μια κενή οθόνη εμφανίζουμε έναν
ProgressDialog.
Ακυρώνουμε έναν διάλογο με τον πιο φυσικό τρόπο στο Android δηλαδή
με το back button. Αυτό το επιτυγχάνουμε ορίζοντας τον διάλογό μας
cancellable(ακυρώσιμο).
2.4.4 Ενημερώνοντας το χρήστη
Σε κάποιες περιπτώσεις θέλουμε να ενημερώσουμε το χρήστη για ένα
αποτέλεσμα σχετικό με την εφαρμογή μας. Μερικά από αυτά τα αποτελέσματα
26
απαιτούν κάποια απάντηση από το χρήστη και κάποια άλλα όχι. Έτσι
χρησιμοποιούμε 2 είδη μηνυμάτων: toast notification και status bar notification.
Το toast notification είναι ένα μήνυμα που εμφανίζεται για λίγα
δευτερόλεπτα στο παράθυρο που βρίσκεται ο χρήστης οποιασδήποτε
εφαρμογής.Ο χώρος που καταλαμβάνει είναι ελάχιστος ώστε το μήνυμα να είναι
εμφανές, ενώ ο χρήστης μπορεί να αλληλεπιδρά με την activity στην οποία
βρίσκεται όσο εμφανίζεται το μήνυμα.
Το status bar notification είναι μια ειδοποιήση που εμφανίζεται στην
status bar του κινητού τηλεφώνου μας και την οποία μπορούμε να ανοίξουμε
είτε βρισκόμαστε στο κεντρικό μενού του τηλεφώνου μας είτε σε κάποια
εφαρμογή. Τις περισσότερες φορές οι toast notification ενεργοποιούνται από
activities ενώ οι status bar notification από services.
2.5 APPLICATION RESOURCES
Όλα τα στατικά στοιχεία που χρησιμοποιεί η εφαρμογή μας, όπως
εικόνες και τα strings που χρησιμοποιούμε στον κώδικα μας αποτελόυν τον όρο
applicaton resources. Τα στοιχεία αυτά πρέπει να δηλώνονται σε διαφορετικά
σημεία από τις κλάσεις μας για λόγους συμβατότητας. Για να υποστηρίζει η
εφαρμογή μας αρκετές γλώσσες θα μπορούσαμε να κρατάμε σε διαφορετικό
αρχείο τα strings για κάθε γλώσσα και να τα προσπελαύνουμε με τον ίδιο τρόπο
από τον κώδικα της εφαρμογής μας.
2.5.1 Προσανατολισμός
Οι συσκευές με λειτουργικό σύστημα Android μπορούν να τοπο8ετηθούν
είτε σε προσανατολισμό πορτέτου (portrait mode) είτε σε προσανατολισμό
τοπίου (landscape mode). Στην πρώτη περίπτωση το κινητό μας βρίσκεται σε
όρθια θέση δηλαδή η μεγαλύτερη πλευρά της οθόνης είναι κατακόρυφη, ενώ
στην δεύτερη περίπτωση η μεγαλύτερη πλευρά του κινητού μας είναι οριζόντια.
Το λειτουργικό σύστημα Android έχει την δυνατότητα να επανασχεδιάζει τα
γραφικά στοιχεία όταν αλλάζουμε τον προσανατολισμό και να τα εμφανίζει με
τον τρόπο που τα έχουμε ορίσει εμείς. Το user interface παρουσιάζεται με την
ίδια διάταξη και στους δύο προσανατολισμούς.
27
Η διάταξη γραφικών στοιχείων δηλώνεται σε αρχεία XML. Υπάρχει ένας
φάκελος res/layout/ όπου βάζουμε όλα τα αρχεία XML. Η εντολή που
χρησιμοποιούμε για να δηλώσουμε το αρχείο XML που θα χρησιμοποιηθεί σε
μία activity είναι η setContentView(). Όταν εκτελεστεί η εντολή setContentView()
το λειτουργικό σύστημα Android θα ελέγξει τον προσανατολισμό της συσκευής
μας και θα επιλέξει το κατάλληλο αρχείο XML.
2.5.2 Μέγεθος οθόνης
Όπως
στον
προσανατολισμό
έτσι
και
εδώ
μπορούμε
να
χρησιμοποιήσουνε διαφορετικά γραφικά στοιχεία ή διαφορετική διάταξη των
στοιχείων αυτών ανάλογα με το μέγεθος της οθόνης. Αποθηκεύουμε σε
διαφορετικούς φακέλους αναλογα με το μέγεθος οθόνης. Το λειτουργικό
σύστημα θα εντοπίσει αυτόματα την οθόνη της συσκευής του χρήστη και θα
επιλέξει τα κατάλληλα αρχεία. ∆εν δηλώνουμε τίποτα σχετικό με το μέγεθος της
οθόνης ή άλλη παράμετρο το λειτουργικό σύστημα θα επιλέγει αυτόματα τα
κατάλληλα αρχεία από αυτά που έχουμε δηλώσει.
2.5.3 Γλώσσα
Οι εφαρμογές Android θα πρέπει να απευθύνονται σε ευρύ κοινό.
Σημαντικό ρόλο παίζει η γλώσσα που θα είναι γραμμένη η εφαρμογή.
Μπορούμε λοιπόν να προσπαθήσουμε να μεταφράσουμε την εφαρμογή μας σε
πολλές γλώσσες. Το κείμενο που υπάρχει στην εφαρμογή είναι ένα σύνολο από
strings. Έχουμε δυο τρόπους για να εμφανίσουμε ένα string σε κάποιο σημείο
της εφαρμογής μας. Ο πρώτος τρόπος είναι που ορίζουμε στον κώδικα μας ένα
string με την τιμή του για παάδειγμα: String HelloWorld = “Hello World”.
Όμως σε μία εφαρμογή με μεγάλο κώδικα θα υπάρχει πρόβλημα διότι θα
θέλουμε να μεταφράσουμε όλα αυτά τα strings. Η λύση όμως υπάρχει στο
Android που είναι και ο δεύτερος τρόπος για να εμφανίσουμε τα strings.
Στο αρχείο res/values/ υπάρχει το αρχείο strings.xml. Εκεί δηλώνουμε
όλα τα string που χρησιμοποιεί η εφαρμογή με τον εξής τρόπο: <string
name=”HelloWorld”>Hello World</string> και αναφερόμαστε σε αυτά μέσα στις
κλάσεις μας με την εντολή
getString(R.string.HelloWorld). Έτσι γίνεται
ανεξάρτητη η γλώσσα της εφαρμογής μας με τον κώδικα στις activities.
28
2.6 ANDROID MANIFEST
Όταν ξεκινάμε ένα νέο project μιας android εφαρμογής δημιουργείται
αυτόματα ένα αρχείο AndroidManifest.xml [2]. Αυτό το αρχείο περιλαμβάνει
βασικές πληροφορίες σχετικά με την εφαρμογή τις οποίες πρέπει να τις ξέρει το
λειτουργικό σύστημα πριν τρέξει οποιοδήποτε κώδικα. Αυτές οι πληροφορίες
είναι οι εξής:
•
Η ονομασία του πακέτου της Java εφαρμογής.
•
Η έκδοση της εφαρμογής.
•
Η έκδοση του λειτουργικού συστήματος Android που απαιτεί η
εφαρμογή.
•
Το όνομα της εφαρμογής καθώς και το εικονίδιο της.
•
Οι άδειες που χρειάζονται για να εκτελεστούν ορισμένες λειτουργίες της
εφαρμογής.
•
Όλα τα συστατικά στοιχεία(activities,services,content providers,broadcast
receivers) της εφαρμογής.
•
Οι εξωτερικές βιβλιοθήκες που χρησιμοποιεί η εφαρμογή μας.
29
ΚΕΦΑΛΑΙΟ 3 ΦΑΣΕΙΣ ΑΝΑΠΤΥΞΗΣ ΕΦΑΡΜΟΓΗΣ
Σε αυτό το κεφάλαιο παρουσιάζονται οι φάσεις ανάπτυξης της
εφαρμογής. Αρχικά, γίνεται ανάλυση των απαιτήσεων της προς την κατασκευή
συστήματος. Στη συνέχεια πραγματοποιείται η σχεδίαση και τέλος περνάμε στη
φάση της υλοποίησης και εν συνεχεία του ελέγχου του συστήματος και της
διανομής. Το γραμμικό μοντέλο που χρησιμοποιούμε είναι το «μοντέλο
καταρράκτη» που απεικονίζεται στην παρακάτω εικόνα 3-1.
Εικόνα 3-1:Γραμμικό μοντέλο καταρράκτη [3]
3.1 ΑΝΑΛΥΣΗ
Στην ενότητα αυτή παρουσιάζεται η φάση της ανάλυσης του συστήματος
και η καταγραφή της αρχικής ιδέας για την δημιουργία της εφαρμογής που
πρόκειται να αναπτυχθεί. Είναι η πρώτη φάση στην οποία εισαγόμαστε, ώστε
να προχωρήσουμε εν συνεχεία στη σχεδίαση και την υλοποίηση της
εφαρμογής.
30
Στη φάση της ανάλυσης καθορίζονται οι κύριοι στόχοι της εφαρμογής,
συγκεντρώνονται οι απαιτήσεις των χρηστών. Τέλος, προσδιορίζεται η μέθοδος
που θα εφαρμοστεί για την παραγωγή του τελικού έργου.Μερικές από τις
ερωτήσεις που απαντήθηκαν και οι οποίες θα μας βοηθήσουν στην περαιτέρω
οργάνωση της δομής του έργου απεικονίζονται ενδεικτικά στον επόμενο Πίνακα
3-1:
Ανάλυση Χρηστών
Ερώτηση
Απάντηση
Σε ποια βαθμίδα εκπαίδευσης ανήκουν
οι χρήστες;
Από δευτεροβάθμια εκπαίδευση και άνω.
Ποια η ηλικία των χρηστών;
Άνω των 15
Τι γλώσσα μιλούν;
Ελληνική, Αγγλικά
Έχουν χρησιμοποιήσει παλαιότερα
Smartphone;
Όχι
Έχουν χρησιμοποιήσει παρόμοιες
εφαρμογές;
Όχι
Ανάλυση τεχνολογίας & απαιτούμενου χρόνου υλοποίησης
Ερώτηση
Απάντηση
Υπάρχει πρόσβαση στο διαδίκτυο;
Ναι
Τι τεχνολογία πρέπει να
χρησιμοποιηθεί;
3G WCDMA, Wi-Fi, GPS
Τι πολυμεσικά στοιχεία απαιτούνται;
Smartphone με λειτουργικό Android.
Πως θα γίνει η διανομή του τελικού
προϊόντος;
Θα αναρτηθεί στο Android Market και θα
παρέχεται στους χρήστες δωρεάν.
Πόσο χρόνο διαθέτουμε για την
ανάπτυξη του έργου;
Περίπου 6 μήνες
Πίνακας 3-1 : Καταγραφή βασικών ιδεών
31
Έπειτα καθορίστηκαν τα διάφορα τμήματα υλοποίησης του έργου και
αποφασίστηκε ο χρονοπρογραμματισμός αυτού. Παράλληλα, τοποθετήθηκαν
αυτά σε χρονική σειρά και προγραμματίστηκε η χρονική διάρκεια τους. Το
χρονοδιάγραμμα εκπόνησης του έργου διακρίνεται στον επόμενο πίνακα 3-2:
Πλάνο εργασιών
Απρίλιος
Μάιος
Ιούνιος
Ιούλιος
Αύγουστος Σεπτέμβριος
Φάση Α: Ανάλυση
Καταγραφή βασικών ιδεών
Χρονοπρογραμματισμός &
πλάνο σταδίων έργου
Φάση Β: Σχεδίαση
Κατηγοριοποίηση & επιλογή
περιεχομένου
Φάση Γ : Υλοποίηση
Συγκέντρωση & επεξεργασία
πρωτογενούς υλικού
Φάση ∆ :
Έλεγχος
Έλεγχος λειτουργίας
εφαρμογής και απαιτήσεων
χρηστών
∆ιορθώσεις για την
παραγωγή του τελικού
προϊόντος
Πίνακας 3-2 : Πλάνο & χρονοπρογραμματισμός έργου
3.2 ΣΧΕ∆ΙΑΣΗ
Η φάση της σχεδίασης είναι η δεύτερη φάση στην οποία εισαγόμαστε. Οι
γενικοί στόχοι και οι αρχές που καθορίστηκαν κατά την φάση της ανάλυσης
μετατρέπονται σε μια ολοκληρωμένη αναλυτική περιγραφή της εφαρμογής. Σε
αυτή τη φάση καθορίζεται η αρχιτεκτονική του συστήματος.
3.2.1 Απαιτήσεις σχεδιασμού
Κατά το σχεδιασμό μιας εφαρμογής υπάρχουν κάποιες απαιτήσεις που
θέλουμε να έχει. Τα εργαλεία που χρησιμοποιήθηκαν έχουν πολλές
δυνατότητες και είναι όλα open source. Για όλους τους χρήστες που θα
χρησιμοποιήσουν αυτή την εφαρμογή το μόνο που απαιτείται είναι ένα
smartphone με λειτουργικό Android, GPS
και σύνδεση στο Internet. Η
32
εφαρμογή θα είναι δωρεάν για όποιον την χρειάζεται στο Android Market, όπου,
σε περίπτωση εξέλιξης κάποιας τεχνολογίας, θα μπορεί να τροποποιηθεί και να
βελτιωθεί. Για την ανάλυση απαιτήσεων έγινε αρχικά μια έρευνα, όπου
μελετήθηκαν
και
παρόμοια
συστήματα
που
υπάρχουν
στο
διαδίκτυο.
Ακολουθούν οι απαιτήσεις που προέκυψαν κατά το σχεδιασμό του λογισμικού:
Το περιβάλλον διεπαφής με τους χρήστες πρέπει να είναι απλό και να μην
χρειάζεται ιδιαίτερες γνώσεις.
3.2.2 ∆ομή της Εφαρμογής
Η ανάπτυξη της έγινε με τη γλώσσα προγραμματισμού Java. Για τη
διαγραμματική απεικόνιση της δομής της εφαρμογής κατά τη φάση της
σχεδίασης χρησιμοποιήθηκε το εργαλείο λογισμικού UML. Η UML είναι μια
οπτική αντικειμενοστραφής γλώσσα μοντελοποίησης που χρησιμοποιείται για
απεικόνιση
(visualization),
προδιαγραφή
(specification),
τεκμηρίωση
(documentation) και κατασκευή (construction) των δομικών συστατικών ενός
συστήματος λογισμικού. Για την ευκολότερη κατανόηση της δομής της
εφαρμογής βλέπουμε την παρακάτω εικόνα 3-2 :
Εικόνα 3-2: Γενική δομή της εφαρμογής
33
3.3 ΥΛΟΠΟΙΗΣΗ
Η φάση της υλοποίησης είναι η τρίτη φάση στην οποία εισαγόμαστε. Στα
προηγούμενα υποκεφάλαια παρουσιάστηκαν η φάση της ανάλυσης και της
σχεδίασης του συστήματός-της εφαρμογής μας. Στη φάση αυτή θα βασιστούμε
στα δεδομένα που προέκυψαν από τις δύο προηγούμενες φάσεις (ανάλυση και
σχεδίαση), ώστε να προχωρήσουμε στην υλοποίηση της εφαρμογής. Ο
ολοκληρωμένος κώδικας της εφαρμογής, παρουσιάζεται για λόγους οργάνωσης
στο παραρτήμα της παρούσας πτυχιακής εργασίας. Επίσης, θα εκβαθύνουμε
στη νοοτροπία και τις τεχνικές που χρησιμοποιούνται κατά την ανάπτυξη του
κώδικα της εφαρμογής.
3.3.1 Πλατφόρμα και εργαλεία ανάπτυξης
Για την ανάπτυξη της εφαρμογής χρησιμοποιήθηκε ένας υπολογιστής με
λειτουργικό σύστημα Windows 7. Σε αυτόν τον υπολογιστή εγκαταστάθηκε το
περιβάλλον ανάπτυξης λογισμικού Eclipse το οποίο περιλαμβάνει ένα
ολοκληρωμένο περιβάλλον ανάπτυξης εφαρμογών Java IDE. Το Android
Development Tools (ADT) για το Eclipse. Το Android SDK και AVD Manager
όπου διευκόλυνε την ανάπτυξη με το Android σε πολλές εκδόσεις της
πλατφόρμας ταυτόχρονα. Απαραίτητο το
είμαστε
σε
θέση
να
δουλέψουμε
Java Development Kit ώστε να
αποτελεσματικά
με
τη
γλώσσα
προγραμματισμού Java, με τη χρήση της οποίας θα γίνει η ανάπτυξη της
εφαρμογής.
3.3.2 Αρχιτεκτονική της εφαρμογής
Πριν προχωρήσουμε στην ανάλυση των διαφόρων λειτουργιών της
εφαρμογής που αναπτύχθηκε, θα ήταν χρήσιμο να παρουσιάσουμε πρώτα την
δομή της, πως δηλαδή οργανώνονται όλα τα αρχεία που περιέχονται σε αυτήν
και ποια είναι η κύρια λειτουργία τους. Στο προγραμματιστικό περιβάλλον
Eclipse στο οποίο αναπτύχθηκε η εφαρμογή, το project εμφανίζεται με την
παρακάτω δομή:
34
Εικόνα 3-3: ∆ομή εφαρμογής
Ακολουθεί η επεξήγηση των παραπάνω φακέλων και αρχείων καθώς και
του περιεχομένου τους:
•
src/
Εικόνα 3-4: Περιεχόμενα φακέλου src/
35
Ο φάκελος αυτός περιέχει τα πακέτα τα οποία έχουμε δηλώσει στην
εφαρμογή μας. ‘Εχουμε δηλώσει τρία πακέτα, το ‘’com.gpslocator’’, το
“com.gpslocator.adapters” και το “com.gpslocator.model”. Το κάθε πακέτο
περιλαμβάνει τις κλάσεις της εφαρμογής. Οι κλάσεις αυτές χωρίζονται στις
activities, δηλαδή στις διαφορετικές οθόνες της εφαρμογής μας. Με αρχική
οθόνη την StartScreen.java.
•
gen/
Εικόνα 3-5: Περιεχόμενα φακέλου gen/
Ο φάκελος αυτός περιέχει το αρχείο R.java το οποίο ουσιαστικά είναι μια
κλάση η οποία κατασκευάζεται αυτόματα από το σύστημα. Η κλάση αυτή
συνδέει όλα τα application resources με τον κώδικα της εφαρμογής μας. Όλα
αυτά τα resources δηλώνονται σε ξεχωριστά αρχεία και όχι μέσα στις κλάσεις
της εφαρμογής μας.
•
Google APIs/
Εικόνα 3-6: Βιβλιοθήκες του λειτουργικού συστήματος Android
Πρόκειται για τις βιβλιοθήκες που επιλέγονται αυτόματα από το σύστημα,
όταν εμείς δηλώσουμε την ελάχιστη έκδοση Android με την οποία θα είναι
συμβατή η εφαρμογή μας. Συγκεκριμένα, όταν ξεκινάμε ένα project για την
κατασκευή Android application τότε ανάμεσα στις διάφορες επιλογές, πρέπει να
36
επιλέξουμε και το Build Target της εφαρμογής μας, που σημαίνει την ελάχιστη
έκδοση Android με την οποία θέλουμε να είναι συμβατή η εφαρμογή μας. Έτσι
το σύστημα τοποθετεί τις κατάλληλες βιβλιοθήκες για να λειτουργεί η εφαρμογή
μας στις εκδόσεις αυτές (αρκεί να έχουμε εγκαταστήσει τις εκδόσεις αυτές μέσω
της ADT Plugin). Συγκεκριμένα η εφαρμογή μας είναι συμβατή για εκδόσεις
Android 2.2 και νεότερες.
•
assets/
Στο φάκελο αυτό μπορούμε να αποθηκεύσουμε οποιοδήποτε αρχείο
θέλουμε ή και να δημιουργήσουμε υποφακέλους. Ωστόσο όλα τα application
resources αποθηκεύονται σε διαφορετικό φάκελο, πράγμα που καθιστά τον
φάκελο αυτό όχι τόσο χρήσιμο όσο τους άλλους. Μπορεί ο προγραμματιστής
της κάθε εφαρμογής να αποθηκεύει κάποια αρχεία εκεί και να τα χρησιμοποιεί
όταν αυτά χρειαστούν. Στις περισσότερες εφαρμογές όμως ο φάκελος
παραμένει κενός.
•
res/
Εικόνα 3-7: Όλα τα resources της εφαρμογής
37
Στο φάκελο αυτό αποθηκεύονται όλα τα application resources, τα οποία
χρησιμοποιούμε. Συγκεκριμένα:
Στο φάκελο drawable αποθηκεύουμε όλα τα αρχεία εικόνας που
χρησιμοποιούνται στην εφαρμογή.
Στο φάκελο layout αποθηκεύονται τα αρχεία XML στα οποία δηλώνουμε
το user interface της κάθε οθόνης.
Στο φάκελο raw αποθηκεύονται τα αρχεία txt που έχουμε δηλώσει όλες
τις εναλλακτικές κατηγορίες που στην συνέχεια θα χρησιμοποιήσει ο χρήστης
ανάλογα με τα ενδιαφέροντα του.
Οι φάκελλοι values-el και values-en περιέχουν από ένα αρχείο
strings.xml το οποίο περιλαμβάνει όλα τα strings δηλωμένα με την αγγλική και
την ελληνική τους γλώσσα.
Τέλος υπάρχουν τρία αρχεία τα οποία δημιουργούντα αυτόματα όταν
ξεκινάμε καινούργιο project για μια εφαρμογή Android. Το AndroidManifest.xml
που έχει αναλυθεί σε προηγούμενη ενότητα. Τα άλλα δύο αρχεία αφορούν το
σύστημα και δεν πρέπει να τα επεξεργαζόμαστε.
3.3.3 Χρήση της εφαρμογής
Αφού παρουσιάστηκε η αρχιτεκτονική της εφαρμογής, μπορούμε τώρα
να αναλύσουμε τις λειτουργίες που περιλαμβάνει η εφαρμογή που αναπτύξαμε,
καθώς και τον τρόπο υλοποίησης αυτών στο προγραμματιστικό περιβάλλον.
Παρακάτω παρουσιάζετε ένα storyboard της εφαρμογής (Εικόνα 3-8), μια προαπεικόνιση της. Τα διάφορα στιγμιότυπα της εφαρμογής παρουσιάζονται σε
εικόνες και εξηγούνται οι διάφορες λειτουργίες της, για να διευκολύνεται ο
αναγνώστης στην κατανόηση των λειτουργιών αυτών. Για την διευκόλυνση της
αναγνωσιμότητας του κειμένου, θα παρουσιαστούν κομμάτια κώδικα από τα
σημαντικότερα αρχεία της εφαρμογής, ενώ ολοκληρωμένα τα αρχεία αυτά
παρατίθενται στο Παράρτημα Ι της παρούσας εργασίας.
Παρατίθενται, επομένως, τα κομμάτια κώδικα που αφορούν βασικές
λειτουργίες της κάθε οθόνης. Ενώ για πιο εξειδικευμένες λειτουργίες,
προτείνεται στον αναγνώστη να μελετήσει τον ολοκληρωμένο τον κώδικα της
αντίστοιχης κλάσης, που παρουσιάζεται στο Παράρτημα Ι.
38
Εικόνα 3-8: Γραφική απεικόνιση της δομής της εφαρμογής
Αρχική Οθόνη
Όταν η εφαρμογή εκτελεστεί εισαγόμαστε στην αρχική οθόνη μέσω της
οποίας μπορούμε να επιλέξουμε την εύρεση της τοποθεσίας μας ή να
ασχοληθούμε με τα σημεία ενδιαφέροντος που μας ενδιαφέρουν και φυσικά όλα
αυτά με την δυνατότητα επιλογής αγγλικής ή και ελληνικής γλώσσας. Η οθόνη
αυτή φαίνεται στην παρακάτω (Εικόνα 3-9):
Εικόνα 3-9: Αρχική οθόνη
39
Πρόκειται για την κλάση StartScreen.java την οποία έχουμε ορίσει σαν
main activity στο AndroidManifest.xml ως εξής:
<activity android:name="com.gpslocator.StartScreen"
android:label="Start screen"
android:theme="@android:style/Theme.Light"
android:configChanges="locale">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Όταν ξεκινάει η activity δηλώνουμε πρώτα τη διεπαφή χρήστη της
οθόνης αυτής με την εντολή setContentView(R.layout.start_page);. Στο αρχείο
start_page.xml έχουμε δηλώσει όλο το γραφικό περιβάλλον της οθόνης αυτής.
Βλέπουμε την κλάση StartScreen.java και τις μεθόδους που περιλαμβάνει για
να υλοποιήθούν οι λειτουργίες της:
public class StartScreen extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* Με την παρακάτω εντολή εισαγόμαστε στο αρχείο start_page.xml όπου
εκεί καθορίζουμε το πώς θα φαίνεται η αρχική μας οθόνη. */
setContentView(R.layout.start_page);
initializeUI();
}
public void initializeUI () {
/* Έχουμε ένα object τύπου Button που και ορίζεται στο αρχείο
start_page.xml */
final Button myLocationButton = (Button)findViewById(R.id.ButtonMyPosition);
40
final Button poiButton = (Button)findViewById(R.id.ButtonPOI);
Button buttonEnglish = (Button)findViewById(R.id.buttonEnglish);
Button buttonGreek = (Button)findViewById(R.id.buttonGreek);
myLocationButton.setOnClickListener(new OnClickListener() {
/* Με την μέθοδο onClick πηγαίνουμε από την StartScreen.java στο
LocationMapActivity */
@Override
public void onClick(View v) {
Intent intent = new Intent(StartScreen.this,
LocationMapActivity.class);
startActivity(intent);
}
});
poiButton.setOnClickListener(new OnClickListener() {
/* Με την μέθοδο onClick πηγαίνουμε από την StartScreen.java στην
CategoriesActivity */
@Override
public void onClick(View v) {
Intent intent = new Intent(StartScreen.this,
CategoriesActivity.class);
startActivity(intent);
}
});
buttonEnglish.setOnClickListener(new OnClickListener() {
/* Με τις δύο επόμενες μεθόδους onClick
από την StartScreen.java
κάνουμε την αλλαγή από ελληνικά σε αγγλικά */
@Override
public void onClick(View v) {
String languageToLoad = "en";
Locale locale = new Locale(languageToLoad);
41
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, null);
myLocationButton.setOnClickListener(null);
poiButton.setOnClickListener(null);
setContentView(R.layout.start_page);
initializeUI();
}
});
buttonGreek.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String languageToLoad = "el";
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
//StartScreen.this.onConfigurationChanged(config);
getBaseContext().getResources().updateConfiguration(config, null);
myLocationButton.setOnClickListener(null);
poiButton.setOnClickListener(null);
setContentView(R.layout.start_page);
initializeUI();
}
});
}
}
42
Οθόνη εύρεση τοποθεσίας
Στην οθόνη αυτή, ο χρήστης ουσιαστικά μπορεί με την εμφάνιση του
χάρτη να διακρίνει την τοποθεσία του και φυσικά μπορεί να περιηγηθεί στο
δυναμικό αυτό χάρτη ελεύθερα. Αρχικά για να γίνει αυτό θα πρέπει να έχουμε
πάρει ένα apiKey από την Google για να μπορούμε να χρησιμοποιούμε τo
Google Maps. Αυτό θα το δηλώσουμε στο αρχείο main.xml ως εξής:
<com.google.android.maps.MapView
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="0jJqYfsoKZfPUNVb0-c5eIo85FjJ0W3Jlh2DuiQ"
/>
Η λειτουργία της οθόνης αυτής φαίνεται ολοκληρωμένη στην κλάση
LocationMapActivity.java:
public class LocationMapActivity extends MapActivity {
private MapView mapView;
/* Η μέθοδος αυτή καλείται όταν η δραστηριότητα αυτή δημιουργείται για
πρώτη φορά */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.mapView);
mapView.setBuiltInZoomControls(true);
final MapController control = mapView.getController();
control.setZoom(8);
43
final MyLocationOverlay myLocationOverlay = new
MyLocationOverlay(this, mapView);
mapView.getOverlays().add(myLocationOverlay);
myLocationOverlay.enableCompass();
myLocationOverlay.enableMyLocation();
myLocationOverlay.runOnFirstFix(new Runnable() {
public void run() {
control.animateTo(myLocationOverlay.getMyLocation());
}
});
LocationManager manager = (LocationManager)
this.getSystemService(Context.LOCATION_SERVICE);
LocationListener listener = new LocationListener() {
public void onStatusChanged(String provider, int status,
Bundle extras) {
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
if (location != null) {
44
GeoPoint point = new GeoPoint(
(int) (location.getLatitude() * 1E6),
(int) (location.getLongitude() * 1E6));
Toast.makeText(getBaseContext(),
"Latitude: " + location.getLatitude() +
" Longitude: " + location.getLongitude(),
Toast.LENGTH_SHORT).show();
MapController mapController =
mapView.getController();
mapController.animateTo(point);
mapController.setCenter(point);
mapController.setZoom(16);
mapView.invalidate();
}
}
};
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
0, 0, listener);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}
45
Οθόνη επιλογής σημείων ενδιαφέροντος
Η οθόνη αυτή περιλαμβάνει τις κατηγορίες τοπικών πληροφοριών που ο
χρήστης μπορεί να επιλέξει ανάλογα με τα ενδιαφέροντα του (Εικόνα 3-10).
Εικόνα 3-10: Οθόνη επιλογής σημείων ενδιαφέροντος
Οι λειτουρίες της οθόνης αυτής ορίζονται στην κλάση CategoriesActivity.java
εκεί με τη μέθοδο: setContentView(R.layout.categories_page); μεταβαίνουμε
στο αρχείο categories_page.xml όπου εκεί ορίζεται το user interface. Η κλάση
CategoriesActivity.java φαίνεται στο παρακάτω κώδικα:
public class CategoriesActivity extends Activity{
private Double radius;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
46
/* Με την παρακάτω εντολή εισαγόμαστε στο αρχείο categories_page.xml
όπου εκεί καθορίζουμε το πώς θα φαίνεται η οθόνη μας. */
setContentView(R.layout.categories_page);
initializeUI();
}
public void initializeUI() {
Configuration configuration =
getBaseContext().getResources().getConfiguration();
String locale = configuration.locale.toString();
final int lang;
Log.d("Categories", "Locale="+locale);
if (locale.equals("en_US")) {
lang=0;
} else {
lang=1;
}
ListView categoriesList =
(ListView)findViewById(R.id.categoriesList);
/* Εδώ με το object setAdapter καθορίζει πως θα φαίνεται το κάθε στοιχείο
στη λίστα μας */
categoriesList.setAdapter(new CategoriesListAdapter(this, lang));
categoriesList.setOnItemClickListener(new OnItemClickListener()
{
/* Με την μέθοδο onItemClick ορίζουμε τις μεταβλητές μας */
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int pos, long arg3) {
47
Intent intent = new Intent(CategoriesActivity.this,
ResultsActivity.class);
intent.putExtra("lang", lang);
intent.putExtra("categoryId", pos);
intent.putExtra("radius", radius);
startActivity(intent);
}
});
final EditText radiusInput = (EditText)
findViewById(R.id.radiusInput);
final Button radiusSetButton = (Button)
findViewById(R.id.radiusSetButton);
radiusSetButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Editable radiusText = radiusInput.getText();
try {
radius =
Double.parseDouble(radiusText.toString());
} catch (NumberFormatException nfe) {
Toast.makeText(CategoriesActivity.this,
"Wrong number, please try again", 2);
}
}
});
}
}
48
Οθόνη αποτελεσμάτων
Στην οθόνη αυτή (Εικόνα 3-11) όπου ορίζεται από την κλάση
ResultsActivity.java
παρουσιάζονται
τα
αποτελέσματα
των
σήμειων
ενδιαφέροντος που έχει επιλέξει ο χρήστης την βλέπουμε παρακάτω:
Εικόνα 3-11: Οθόνη αποτελεσμάτων
public class ResultsActivity extends Activity {
private int lang;
private int categoryId;
private double radius;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
49
/* Με την παρακάτω εντολή εισαγόμαστε στο αρχείο results_page.xml
όπου εκεί καθορίζουμε το πώς θα φαίνεται η οθόνη μας. */
setContentView(R.layout.results_page);
Bundle extras = getIntent().getExtras();
lang = extras.getInt("lang");
categoryId = extras.getInt("categoryId");
radius = extras.getDouble("radius");
initializeUI();
}
private void initializeUI() {
ListView resultListView = (ListView)findViewById(R.id.resultsList);
final ResultListAdapter resultListAdapter = new
ResultListAdapter(this, lang, categoryId, radius);
resultListView.setAdapter(resultListAdapter);
final TextView poiNameTextView =
(TextView)findViewById(R.id.poiName);
final TextView poiDescriptionTextView =
(TextView)findViewById(R.id.poiDescription);
final TextView poiLocation =
(TextView)findViewById(R.id.poiLocation);
final TextView poiDistance =
(TextView)findViewById(R.id.poiDistance);
50
resultListView.setOnItemClickListener(new OnItemClickListener()
{
double myLat=38.245991;
double myLon= 21.735238;
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int pos, long arg3) {
POI poi = resultListAdapter.getPoiList().get(pos);
double distance = distFrom(myLat, myLon,
poi.getLatitude(), poi.getLongitude());
DecimalFormat df = new DecimalFormat("#.##");
if (lang==0) {
poiNameTextView.setText(poi.getNameEn());
poiDescriptionTextView.setText(poi.getDescriptionEn());
poiLocation.setText(poi.getLatitude()+"/"+poi.getLongitude());
poiDistance.setText(df.format(distance)+"
km");
} else {
poiNameTextView.setText(poi.getName());
poiDescriptionTextView.setText(poi.getDescription());
poiLocation.setText(poi.getLatitude()+"/"+poi.getLongitude());
poiDistance.setText(df.format(distance)+"
χλμ");
}
}
51
/* Haversine formula: επιστρέφει την απόσταση δυο σημείων σε χιλιόμετρα
*/
public double distFrom(double lat1, double lng1, double lat2, double lng2) {
double earthRadius = 6371000;
double dLat = Math.toRadians(lat2-lat1);
double dLng = Math.toRadians(lng2-lng1);
double sindLat = Math.sin(dLat / 2);
double sindLng = Math.sin(dLng / 2);
double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2)
* Math.cos(Math.toRadians(lat1)) *
Math.cos(Math.toRadians(lat2));
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
double dist = earthRadius * c;
return dist;
}
});
}
}
Το
γραφικό
περιβάλλον
της
ResultsActivity.java
και
της
ResultsListAdapters.java καθορίζεται από τα αρχεία result_page.xml και
result_list_item.xml αντίστοιχα.
52
3.4 ΕΛΕΓΧΟΣ
Στη φάση αυτή παρουσιάζονται ο τρόπος ελέγχου του συστήματος που
αναπτύχθηκε καθώς και αναλυτικά τα αποτελέσματα του ελέγχου της
εφαρμογής. Η φάση αυτή ακολουθεί μετά από τη φάση της υλοποίησης και σε
περίπτωση που εντοπιστούν παραλήψεις ή δυσλειτουργίες, επιστρέφουμε στη
φάση της υλοποίησης ή και σε κάποια προγενέστερη φάση αν κάτι τέτοιο
κρίνεται απαραίτητο, με σκοπό την αποδοτικότερη τελική λειτουργία του
συστήματός.
Για τον έλεγχο του συστήματος χρησιμοποιήθηκε η τεχνική του “μαύρου
κουτιού. Η στρατηγική του «μαύρου κουτιού» βασίζεται στις προδιαγραφές του
λογισμικού δεν «κοιτάει» τον κώδικα,εξετάζει μόνο τις εισόδους (Input) και τα
αποτελέσματα (Output) που θα πρέπει να αντιστοιχούν σε αυτές. ∆οκιμάζουμε
αν είναι δυνατόν όλα τα πιθανά δεδομένα εισόδου που μπορεί να προκαλέσουν
σφάλμα (πιθανές περιπτώσεις ελέγχου). Στην παρούσα εργασία το ρόλο του
‘’μαύρου κουτιού’’ έχει το sdk > libraries > functions > API. Για παράδειγμα όταν
λαμβάνουμε τις συντεταγμένες για το που βρισκόμαστε απλά εμείς καλούμε την
συνάρτηση, δεν δεχόμαστε τα δεδομένα από το GPS για να τα επεξεργαστούμε
το κάνει μόνο του.
Ο έλεγχος του συστήματος έγινε σε συνάφεια με την ανάλυση, τη
σχεδίαση και την υλοποίηση του συστήματος. Ο έλεγχος του συστήματος
αποτέλεσε σημαντική διαδικασία στην επιτυχημένη ανάπτυξη του συστήματος,
αφού όχι μόνο πιστοποιεί τον σχεδιασμό του συστήματος, αλλά το
σημαντικότερο είναι ότι σε ενδιάμεσα στάδια της ανάπτυξης φανέρωσε
αδυναμίες του συστήματος οι οποίες στην συνέχεια διορθώθηκαν.
3.5 ∆ΙΑΝΟΜΗ
Η εφαρμογή μπορεί να διατίθεται διαδικτυακά μέσω της ανάρτησης της
στο Android Market. Επιπλέον λαμβάνεται πρόνοια τήρησης αντιγράφων
ασφαλείας και καθορίζονται τα πνευματικά δικαιώματα της εφαρμογής, δηλαδή
η άδεια χρήσης του προϊόντος. ∆ημιουργείται το εγχειρίδιο του χρήστη όπου
περιλαμβάνονται οδηγίες σχετικές με την εγκατάσταση του προϊόντος και την
χρήση της εφαρμογής. Μετά την υλοποίηση του λογισμικού, γίνεται η
διαμόρφωση του τελικού προϊόντος για τη διάθεσή του αναλόγως.
53
ΚΕΦΑΛΑΙΟ 4. ΣΥΜΠΕΡΑΣΜΑΤΑ – ΜΕΛΛΟΝΤΙΚΕΣ
ΕΠΕΚΤΑΣΕΙΣ
4.1 ΣΥΜΠΕΡΑΣΜΑΤΑ
Το Android χρησιμοποιείται στο μεγαλύτερο ποσοστό smartphones της
αγοράς και ο αριθμός του αυξάνεται ανά εβδομάδα. Η εκμάθηση της
φιλοσοφίας του λειτουργικού αυτού συστήματος κρίνεται εύκολη καθώς και ο
τρόπος ανάπτυξης εφαρμογών. Ο καθένας μπορεί να ασχοληθεί και να
δημιουργήσει μία απλή προσωπική εφαρμογή αρκεί να εξοικειωθεί με την
γλώσσα προγραμματισμού Java. Όλα τα εργαλεία βρίσκονται ελεύθερα στο
διαδίκτυο χωρίς κάποιο κόστος καθώς και αναλυτικοί οδηγοί για εξοικείωση της
νέας τεχνολογίας.
Το Android Market δίνει την δυνατότητα στους προγραμματιστές να
δημοσιεύσουν ελεύθερα και χωρίς κόστος τις εφαρμογές τις οποίες έχουν
κατασκευάσει. Το μόνο αρχείο που χρειάζεται για την διαδικασία αυτή είναι το
εκτελέσιμο .apk της εφαρμογής. Έτσι η εφαρμογή γίνεται προσβάσιμη σε όλους
τους χρήστες Android και μπορούν να την κατεβάσουν οποιαδήποτε στιγμή από
το Android Market.
Συνοψίζοντας, στην παρούσα εργασία αναπτύχθηκε μία διαδραστική
εφαρμογή για έξυπνες κινητές συσκευές (smartphones) με λειτουργικό σύστημα
Android. Η εν λόγω εφαρμογή βασίζεται στην τεχνολογία εντοπισμού θέσης με
χρήση GPS. Ο κεντρικός στόχος της εργασίας ήταν να δοθεί έμφαση στη
λειτουργικότητα της εφαρμογής και όχι τόσο στην πληρότητα ή στην
ωραιοποίησή της. Αξίζει να σημειωθεί ότι κατά τη διάρκεια της εκπόνησης της
παρούσας εργασίας αποκτήθηκαν σημαντικές γνώσεις για τις τεχνολογίες των
έξυπνων κινητών τηλεφώνων και τον τρόπο ανάπτυξης εφαρμογών σε αυτά.
4.2 ΜΕΛΛΟΝΤΙΚΕΣ ΕΠΕΚΤΑΣΕΙΣ
Η ενασχόληση με τις τεχνολογίες έξυπνων κινητών τηλεφώνων αποτελεί
ένα
νέο
και
συνεχώς
αναπτυσσόμενο
κλάδο
των
Τεχνολογιών
της
Πληροφορικής & Επικοινωνιών (ΤΠΕ). Το τελικό αποτέλεσμα της εργασίας
αυτής, βεβαίως όπως όλες οι εφαρμογές, ανοίγει νέα προοπτική και ευρύ
ορίζοντα για δόμηση νέων ή συμπληρωματικών εφαρμογών. Παρακάτω
54
προτείνονται
ορισμένες
επεκτάσεις
ή
βελτιώσεις
της
εφαρμογής
που
αναπτύχθηκε στα πλαίσια της παρούσας εργασίας:
•
Μετάφραση του περιβάλλοντος διεπαφής της εφαρμογής στις πιο
δημοφιλείς ξένες γλώσσες, με στόχο να αποκτήσουν περισσότεροι
χρήστες ένα επιπλέον κίνητρο για να τη χρησιμοποιήσουν.
•
Βελτιωμένο περιβάλλον διεπαφής (user interface), ώστε να γίνει
ακόμα πιο φιλικό προς το χρήστη.
•
Να συμπεριληφθούν ακόμα περισσότεροι προορισμοί τόσο εντός όσο
κι εκτός Ελλάδος.
•
Να μπορούν να προστεθούν ακόμα περισσότερες πληροφορίες για
κάθε σημείο ενδιαφέροντος, όπως εικόνες, βίντεο ή πιθανά www links
για σημεία ενδιαφέροντος που θα μπορούσε να επισκεφτεί ένας
χρήστης
•
Η εφαρμογή θα μπορούσε επίσης να κάνει χρήση επιπλέον
τεχνολογιών ανίχνευσης. Επιπρόσθετα θα μπορούσε να γίνει
εντοπισμός θέσης μέσω τεχνολογίας Wi-Fi.
•
Για λόγους ασφαλείας θα μπορούσε να παρέχεται δυνατότητα
ελέγχου πρόσβασης αλλά και κρυπτογράφησης των πληροφοριών
της εφαρμογής με ένα κατάλληλο πρωτόκολλο όπως SSL, TSL κ.α.
Κι αυτό διότι, τα δεδομένα που ανταλλάσσονται μεταξύ του
εξυπηρετητή και της συσκευής είναι απλά http μηνύματα χωρίς να
έχει ενεργοποιηθεί καμμία υπηρεσία ασφάλειας.
55
ΒΙΒΛΙΟΓΡΑΦΙΑ
Βιβλία
[1]
Rogers Cadenhead, Laura Lemay, “Πλήρες Εγχειρίδιο της JAVA 6-Πέμπτη
Έκδοση”, Μ.Γκιούρδας, Αθήνα, 2007
[2]
Lauren Darcey, Shane Conder, “Ανάπτυξη Εφαρμογών με το Android-∆εύτερη
Έκδοση’’, Μ.Γκιούρδας, Αθήνα, 2011
[3]
Σ.Ν.∆ημητριάδης, Α.Σ.Πομπόρτσης, Ε.Γ.Τριανταφύλλου, ‘’Τεχνολογία
πολυμέσων Θεωρία και Πράξη’’, Τζιόλα, Θεσσαλονίκη, 2004
[4]
Joshen Schiller, Agnes Voisard, “Location Based Services”, Morgan Kaufmann,
Elsevier, 2004
Ebooks
[5]
Lauren Darcey, Shane Conder, ‘’Sams Teach Yourself Android Application
Development in 24 Hours’’, USA, 2010
[6]
Reto Meier, ‘’Professiomal Android 4 Application Development’’, 2012
[7]
Mark L. Murphy, ‘’Android Programming Tutorials’’, USA, 2009-2011
[8]
J.F. DiMarzio, ‘’Android A Programmer’s Guide’’, USA, 2008
Websites
[9]
‘’Η ιστορία του Android’’, http://www.allaboutandroid.gr/?p=6362, ∆εκέμβριος 2011
[10] ‘’Global Positioning System’’, Wikipedia,
http://el.wikipedia.org/wiki/Global_Positioning_System, Σεπτέμβριος 2012
[11] ‘’Galileo (satellite navigation)’’, Wikipedia,
http://en.wikipedia.org/wiki/Galileo_%28satellite_navigation%29, Ιανουάριος
2011
[12] ‘’Galileo navigation’’, http://www.esa.int/esaNA/GGG0H750NDC_galileo_0.html,
Αύγουστος 2011
[13] “Google Maps JavaScript API v3’’,
https://developers.google.com/maps/documentation/javascript/places?hl=el-GR,
Ιούλιος 2012
[14] ‘’GPS Locator’’, http://www.codeproject.com/Articles/112044/GPSLocator-Appto-Find-Current-Nearest-Location-us, Σεπτέμβριος 2010
[15] ‘’ Installing the Eclipse Plugin’’
http://developer.android.com/sdk/installing/installing-adt.html, Σεπτέμβριος 2010
[16] ‘’Smartphone’’, Wikipedia, http://en.wikipedia.org/wiki/Smartphone, Αύγουστος
2012
56
[17] “Location Based Services”, Wikipedia, http://en.wikipedia.org/wiki/Locationbased_service, Σεπτέμβριος 2012
[18] “Activity”, Tutorials, http://www.learncomputer.com/tutorials/android/activitiesand-intents/activity/, Ιούνιος 2012
[19] “Activity”, http://developer.android.com/reference/android/app/Activity.html,
Ιούνιος 2012
[20] ‘’Layouts”, http://developer.android.com/guide/topics/ui/declaring-layout.html,
Ιούνιος 2012
[21] "Updating Android Market/Google Play – Google Play Help",
http://Support.google.com, Μάρτιος 2012.
[22] "Google Play", http://en.wikipedia.org/wiki/Google_Play, Μάρτιος 2012.
[23] "Android Market - Android Apps on Google Play",
http://play.google.com/store/apps/details, Μάρτιος 2012.
57
ΠΑΡΑΡΤΗΜΑ I - ΚΩ∆ΙΚΑΣ ΕΦΑΡΜΟΓΗΣ
StartScreen.Java
package com.gpslocator;
import java.util.Locale;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class StartScreen extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.start_page);
initializeUI();
}
public void initializeUI () {
final Button myLocationButton =
(Button)findViewById(R.id.ButtonMyPosition);
final Button poiButton = (Button)findViewById(R.id.ButtonPOI);
Button buttonEnglish = (Button)findViewById(R.id.buttonEnglish);
Button buttonGreek = (Button)findViewById(R.id.buttonGreek);
myLocationButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(StartScreen.this,
LocationMapActivity.class);
startActivity(intent);
}
});
poiButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(StartScreen.this,
CategoriesActivity.class);
startActivity(intent);
}
});
58
buttonEnglish.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String languageToLoad = "en";
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, null);
myLocationButton.setOnClickListener(null);
poiButton.setOnClickListener(null);
setContentView(R.layout.start_page);
initializeUI();
}
});
buttonGreek.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String languageToLoad = "el";
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
//StartScreen.this.onConfigurationChanged(config);
getBaseContext().getResources().updateConfiguration(config, null);
myLocationButton.setOnClickListener(null);
poiButton.setOnClickListener(null);
setContentView(R.layout.start_page);
initializeUI();
}
});
}
}
LocationMapActivity.Java
package com.gpslocator;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;
59
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
//private LocationManager locationManager;
//private LocationListener locationListener;
public class LocationMapActivity extends MapActivity {
private MapView mapView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.mapView);
mapView.setBuiltInZoomControls(true);
final MapController control = mapView.getController();
control.setZoom(8);
final MyLocationOverlay myLocationOverlay = new MyLocationOverlay(this,
mapView);
mapView.getOverlays().add(myLocationOverlay);
myLocationOverlay.enableCompass();
myLocationOverlay.enableMyLocation();
myLocationOverlay.runOnFirstFix(new Runnable() {
public void run() {
control.animateTo(myLocationOverlay.getMyLocation());
}
});
LocationManager manager = (LocationManager)
this.getSystemService(Context.LOCATION_SERVICE);
LocationListener listener = new LocationListener() {
public void onStatusChanged(String provider, int status, Bundle
extras) {
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
60
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
if (location != null) {
GeoPoint point = new GeoPoint(
(int) (location.getLatitude() * 1E6),
(int) (location.getLongitude() * 1E6));
Toast.makeText(getBaseContext(),
"Latitude: " + location.getLatitude() +
" Longitude: " + location.getLongitude(),
Toast.LENGTH_SHORT).show();
MapController mapController = mapView.getController();
mapController.animateTo(point);
mapController.setCenter(point);
mapController.setZoom(16);
mapView.invalidate();
}
}
};
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
0, 0, listener);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}
CategoriesActivity.java
package com.gpslocator;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.text.Editable;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import com.gpslocator.adapters.CategoriesListAdapter;
61
public class CategoriesActivity extends Activity{
private Double radius;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.categories_page);
initializeUI();
}
public void initializeUI() {
Configuration configuration =
getBaseContext().getResources().getConfiguration();
String locale = configuration.locale.toString();
final int lang;
Log.d("Categories", "Locale="+locale);
if (locale.equals("en_US")) {
lang=0;
} else {
lang=1;
}
ListView categoriesList = (ListView)findViewById(R.id.categoriesList);
categoriesList.setAdapter(new CategoriesListAdapter(this, lang));
categoriesList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int
pos, long arg3) {
Intent intent = new Intent(CategoriesActivity.this,
ResultsActivity.class);
intent.putExtra("lang", lang);
intent.putExtra("categoryId", pos);
intent.putExtra("radius", radius);
startActivity(intent);
}
});
final EditText radiusInput = (EditText) findViewById(R.id.radiusInput);
final Button radiusSetButton = (Button)
findViewById(R.id.radiusSetButton);
radiusSetButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Editable radiusText = radiusInput.getText();
62
try {
radius =
Double.parseDouble(radiusText.toString());
} catch (NumberFormatException nfe) {
Toast.makeText(CategoriesActivity.this, "Wrong
number, please try again", 2);
}
}
});
}
}
ResultsActivity.Java
package com.gpslocator;
import java.text.DecimalFormat;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import com.gpslocator.adapters.ResultListAdapter;
import com.gpslocator.model.POI;
public class ResultsActivity extends Activity {
private int lang;
private int categoryId;
private double radius;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.results_page);
Bundle extras = getIntent().getExtras();
lang = extras.getInt("lang");
categoryId = extras.getInt("categoryId");
radius = extras.getDouble("radius");
initializeUI();
}
private void initializeUI() {
ListView resultListView = (ListView)findViewById(R.id.resultsList);
63
final ResultListAdapter resultListAdapter = new ResultListAdapter(this,
lang, categoryId, radius);
resultListView.setAdapter(resultListAdapter);
final TextView poiNameTextView =
(TextView)findViewById(R.id.poiName);
final TextView poiDescriptionTextView =
(TextView)findViewById(R.id.poiDescription);
final TextView poiLocation = (TextView)findViewById(R.id.poiLocation);
final TextView poiDistance = (TextView)findViewById(R.id.poiDistance);
resultListView.setOnItemClickListener(new OnItemClickListener() {
double myLat=38.245991;
double myLon= 21.735238;
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int
pos, long arg3) {
POI poi = resultListAdapter.getPoiList().get(pos);
double distance = distFrom(myLat, myLon,
poi.getLatitude(), poi.getLongitude());
DecimalFormat df = new DecimalFormat("#.##");
if (distance <= radius/1000) {
if (lang==0) {
poiNameTextView.setText(poi.getNameEn());
poiDescriptionTextView.setText(poi.getDescriptionEn());
poiLocation.setText(poi.getLatitude()+"/"+poi.getLongitude());
poiDistance.setText(df.format(distance)+" km");
} else {
poiNameTextView.setText(poi.getName());
poiDescriptionTextView.setText(poi.getDescription());
poiLocation.setText(poi.getLatitude()+"/"+poi.getLongitude());
poiDistance.setText(df.format(distance)+" χλμ");
}
}
}
/*
* Haversine formula: returns the distance between two points in
kilometers
*/
public double distFrom(double lat1, double lng1, double lat2,
double lng2) {
double earthRadius = 6371000;
64
double dLat = Math.toRadians(lat2-lat1);
double dLng = Math.toRadians(lng2-lng1);
double sindLat = Math.sin(dLat / 2);
double sindLng = Math.sin(dLng / 2);
double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2)
* Math.cos(Math.toRadians(lat1)) *
Math.cos(Math.toRadians(lat2));
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
double dist = earthRadius * c;
return dist;
}
});
}
}
CategoriesListAdapters.java
package com.gpslocator.adapters;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.gpslocator.R;
public class CategoriesListAdapter extends BaseAdapter {
private int lang;
private LayoutInflater layoutInflater;
public CategoriesListAdapter(Context context, int lang) {
this.lang=lang;
this.layoutInflater = LayoutInflater.from(context);
}
public static final String[] categoryStringEn = new String[] {
"Pharmacies", // 0
"Cafeterias", // 1
"Restaurants", // 2
"Fast food", //3
"Churches", // 4
"Hotels", // 5
"Hospitals"
};
65
public static final String[] categoryStringEl = new String[] {
"Φαρμακεία",
"Καφετέριες",
"Εστιατόρια",
"Ταχυφαγεία",
"Εκκλησίες",
"Ξενοδοχεία",
"Νοσοκομεία",
};
@Override
public int getCount() {
return categoryStringEl.length;
}
@Override
public Object getItem(int pos) {
if (lang==0) {
return categoryStringEn[pos];
} else {
return categoryStringEl[pos];
}
}
@Override
public long getItemId(int pos) {
return pos;
}
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null)
{
convertView = layoutInflater.inflate(R.layout.categories_list_item,
null);
viewHolder = new ViewHolder();
viewHolder.categoryName =
(TextView)convertView.findViewById(R.id.categoryName);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
String categoryName;
if (lang==0) {
categoryName=categoryStringEn[pos];
} else {
categoryName=categoryStringEl[pos];
}
66
viewHolder.categoryName.setText(categoryName);
return convertView;
}
static class ViewHolder
{
TextView categoryName;
}
}
ResultListAdapter.Java
package com.gpslocator.adapters;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.gpslocator.R;
import com.gpslocator.model.POI;
public class ResultListAdapter extends BaseAdapter {
private Context context;
private List<POI> poiList;
private LayoutInflater layoutInflater;
private int lang;
private int categoryId;
private double radius;
public ResultListAdapter(Context context, int lang, int categoryId, double radius)
{
this.context = context;
this.layoutInflater = LayoutInflater.from(context);
this.lang=lang;
this.categoryId = categoryId;
this.radius = radius;
poiList = readRawTextFile(context, R.raw.poi);
67
}
@Override
public int getCount() {
return poiList.size();
}
@Override
public Object getItem(int position) {
return poiList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null)
{
convertView = layoutInflater.inflate(R.layout.result_list_item,
null);
viewHolder = new ViewHolder();
viewHolder.resultName =
(TextView)convertView.findViewById(R.id.resultName);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
String resultName;
if (lang==0) {
resultName = poiList.get(position).getNameEn();
} else {
resultName = poiList.get(position).getName();
}
viewHolder.resultName.setText(resultName);
return convertView;
}
private List<POI> readRawTextFile(Context ctx, int resId)
{
InputStream inputStream = ctx.getResources().openRawResource(resId);
68
List<POI> poiList = new ArrayList<POI>();
InputStreamReader inputreader = new InputStreamReader(inputStream);
BufferedReader buffreader = new BufferedReader(inputreader);
String line;
StringBuilder text = new StringBuilder();
try {
while (( line = buffreader.readLine()) != null) {
POI poi = parseResource(line);
if (distFrom(poi.getLatitude(), poi.getLongitude(), 38.245991, 21.735238) < radius {
if (poi.getCategoryId().equals(categoryId)) {
poiList.add(poi);
}
}
}
} catch (IOException e) {
return null;
}
return poiList;
}
static class ViewHolder {
TextView resultName;
}
private static POI parseResource(String txtLine) {
String[] split = txtLine.split("\\|");
// Check
POI poi = new POI();
poi.setId(Integer.parseInt(split[0]));
poi.setCategoryId(Integer.parseInt(split[1]));
poi.setName(split[2]);
poi.setNameEn(split[3]);
poi.setLatitude(Double.parseDouble(split[4]));
poi.setLongitude(Double.parseDouble(split[5]));
poi.setDescription(split[6]);
poi.setDescriptionEn(split[7]);
return poi;
}
/**
* @return the poiList
*/
public List<POI> getPoiList() {
return poiList;
}
/**
* @param poiList the poiList to set
*/
public void setPoiList(List<POI> poiList) {
69
this.poiList = poiList;
}
/*
* Haversine formula: returns the distance between two points in kilometers
*/
public static double distFrom(double lat1, double lng1, double lat2, double lng2)
{
double earthRadius = 6371000;
double dLat = Math.toRadians(lat2-lat1);
double dLng = Math.toRadians(lng2-lng1);
double sindLat = Math.sin(dLat / 2);
double sindLng = Math.sin(dLng / 2);
double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2)
* Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2));
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
double dist = earthRadius * c;
return dist;
}
}
POI.Java
package com.gpslocator.model;
public class POI {
private Integer id;
private Integer categoryId;
private String name;
private String nameEn;
private String description;
private String descriptionEn;
private Double latitude;
private Double longitude;
/**
* @return the id
*/
public Integer getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(Integer id) {
this.id = id;
}
/**
* @return the categoryId
*/
public Integer getCategoryId() {
return categoryId;
}
/**
70
* @param categoryId the categoryId to set
*/
public void setCategoryId(Integer categoryId) {
this.categoryId = categoryId;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the nameEn
*/
public String getNameEn() {
return nameEn;
}
/**
* @param nameEn the nameEn to set
*/
public void setNameEn(String nameEn) {
this.nameEn = nameEn;
}
/**
* @return the description
*/
public String getDescription() {
return description;
}
/**
* @param description the description to set
*/
public void setDescription(String description) {
this.description = description;
}
/**
* @return the descriptionEn
*/
public String getDescriptionEn() {
return descriptionEn;
}
/**
* @param descriptionEn the descriptionEn to set
*/
public void setDescriptionEn(String descriptionEn) {
this.descriptionEn = descriptionEn;
}
/**
* @return the latitude
71
*/
public Double getLatitude() {
return latitude;
}
/**
* @param latitude the latitude to set
*/
public void setLatitude(Double latitude) {
this.latitude = latitude;
}
/**
* @return the longitude
*/
public Double getLongitude() {
return longitude;
}
/**
* @param longitude the longitude to set
*/
public void setLongitude(Double longitude) {
this.longitude = longitude;
}
}
Start_page.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<!-<!-<!-<!--
<ImageView android:layout_width="fill_parent" -->
android:layout_height="wrap_content" -->
android:src="@drawable/card" -->
/> -->
<Button android:id="@+id/ButtonMyPosition"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/start_page_button1"/>
<Button android:id="@+id/ButtonPOI"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="@string/start_page_button2" />
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
72
<Button android:id="@+id/buttonEnglish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="100dp"
android:text="English"/>
<Button android:id="@+id/buttonGreek"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ελληνικά"/>
</LinearLayout>
</LinearLayout>
Results_page.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/resultsText" />
<ListView android:id="@+id/resultsList"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.7"
/>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="200dp" android:orientation="vertical">
<TextView android:id="@+id/poiName" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textSize="18dp"
android:paddingBottom="10dp"/>
<TextView android:id="@+id/poiDescription" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textSize="14dp"
android:paddingBottom="10dp"/>
<TextView android:id="@+id/poiLocation" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textSize="12dp"
android:textColor="#888888"/>
<TextView android:id="@+id/poiDistance" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textSize="12dp"
android:textColor="#888888"/>
</LinearLayout>
73
</LinearLayout>
Results_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView android:id="@+id/resultName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="17dp"/>
</LinearLayout>
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<com.google.android.maps.MapView
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="0jJqYfsoKZfPUNVb0-c5eIo85FjJ0W3Jlh2DuiQ"
/>
</LinearLayout>
Categories_page.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView android:id="@+id/radiusText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/radiusString" />
<EditText android:id="@+id/radiusInput"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/radiusHint"
74
android:inputType="number"
/>
<Button android:id="@+id/radiusSetButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/radiusButtonText"
/>
</LinearLayout>
<ListView android:id="@+id/categoriesList"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
Categories_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView android:id="@+id/categoryName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="17dp"/>
</LinearLayout>
res/values-el.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, GPSLocatorActivity!</string>
<string name="app_name">GPSLocator</string>
<string name="start_page_button1">Η τοποθεσία μου</string>
<string name="start_page_button2">Σημεία ενδιαφέροντος</string>
<string name="radiusString">∆ώστε την ακτίνα σε μέτρα:</string>
<string name="radiusHint">Ακτίνα</string>
<string name="radiusButtonText">Όρισε</string>
<string name="resultsText">Αποτελέσματα</string>
</resources>
res/values-en.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, GPSLocatorActivity!</string>
<string name="app_name">GPSLocator</string>
<string name="start_page_button1">My location</string>
75
<string name="start_page_button2">Points of Interest</string>
<string name="radiusString">Please give radius in meters:</string>
<string name="radiusHint">Radius</string>
<string name="radiusButtonText">Set</string>
<string name="resultsText">Results</string>
</resources>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gpslocator"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<uses-library android:name="com.google.android.maps" />
<activity
android:name="com.gpslocator.LocationMapActivity"
android:label="@string/app_name" >
</activity>
<activity android:name="com.gpslocator.CategoriesActivity"
android:label="Categories"
android:theme="@android:style/Theme.Light"
/>
<activity android:name="com.gpslocator.ResultsActivity"
android:label="Results"
android:theme="@android:style/Theme.Light"
/>
<activity android:name="com.gpslocator.StartScreen"
android:label="Start screen"
android:theme="@android:style/Theme.Light"
android:configChanges="locale">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
76
poi.txt
1|0|Πράπας Χρήστος|Prapas Christos|38.2398428|21.7418332|Φαρμακείο|Pharmacy
2|0|∆ημόπουλος Βασίλειος|Dimopoulos
Vasilios|38.259338|21.7423662|Φαρμακείο|Pharmacy
3|0|Μακρυγιώργης Χαράλαμπος|Makrigiorgis
Charalampos|38.2195408|21.7414658|Φαρμακείο|Pharmacy
4|0|Μαλάμης Βασίλειος|Malamis
Basileios|38.2282481|21.7398736|Φαρμακείο|Pharmacy
5|0|Σιάμου Ζωή|Siamou
Zoi|38.2200262972328|21.7502582073212|Φαρμακείο|Pharmacy
6|0|Παραλίκα Αικατερίνη|Paralika Ekaterini|38.2405586|21.743653|Φαρμακείο|Pharmacy
7|0|Ροδοπούλου Γεωργία|Rodopoulou
Georgia|38.2408964|21.7428203|Φαρμακείο|Pharmacy
8|0|Καρακάση ∆ήμητρα|Karakasi Dimitra|38.2439518|21.7340069|Φαρμακείο|Pharmacy
9|0|Ντζελβέ Αικατερίνη|Ntzelbe Aikaterini|38.2766999|21.7644003|Φαρμακείο|Pharmacy
10|0|∆ραγανίγος Ιωάννης|Draganigos
Ioannis|38.2488267|21.7370397|Φαρμακείο|Pharmacy
11|0|Θεοφιλάτος Χρήστος|Theofilatos
Christos|38.2457658|21.7350146|Φαρμακείο|Pharmacy
12|0|Θλιμμενος Χαραλαμπος|Thlimmenos
Charalampos|38.2680049|21.7523502|Φαρμακείο|Pharmacy
13|0|Κολλυρόπουλος Γεώργιος|Kolliropoulos
Georgios|38.250201|21.7395247|Φαρμακείο|Pharmacy
14|0|Τριβυζά Αικατερίνη|Tribiza Aikaterini|38.2666464|21.7567187|Φαρμακείο|Pharmacy
15|0|Αγγελοπούλου Μαρία|Aggelopoulou
Maria|38.2618972|21.7542099|Φαρμακείο|Pharmacy
16|0|∆ημόπουλος Χρήστος|Dimopoulos
Christos|38.2486284|21.7386791|Φαρμακείο|Pharmacy
17|0|Πολυχρονόπουλος Κωνσταντίνος|Polichronopoulos
Konstantinos|38.2629311|21.7437769|Φαρμακείο|Pharmacy
18|0|Γκίκας Μάριος|Gkikas Marios|38.2458824|21.7340188|Φαρμακείο|Pharmacy
19|0|Καρατζάς Ανδρέας|Karatzas
Andreas|38.2462358|21.7382205|Φαρμακείο|Pharmacy
20|0|Παντελίδης Θεόδωρος|Pantelidis
Theodoros|38.2596089|21.7456954|Φαρμακείο|Pharmacy
21|0|∆ημοπούλου Νικολέττα|Dimopoulou
Nikoletta|38.2486284|21.7386791|Φαρμακείο|Pharmacy
22|0|Παπαδόπουλος Παναγιώτης|Papadopoulos
Panagiotis|38.2558158|21.7389887|Φαρμακείο|Pharmacy
23|0|Κυριακούλη Παναγιώτα|Kiriakouli
Panagiota|38.2356698|21.7374959|Φαρμακείο|Pharmacy
24|0|Παπαθανασίου Πέτρος|Papathanasiou
Petros|38.2518397|21.739436|Φαρμακείο|Pharmacy
25|0|Μπαλέζου Ελένη|Mpalezou Eleni|38.2332221|21.7293271|Φαρμακείο|Pharmacy
26|0|Καραγεωργόπουλος Κωνσταντίνος|Karageorgopoulos
Konstantinos|38.249504|21.7386017|Φαρμακείο|Pharmacy
77
27|0|Λάτσης ∆ημήτριος|Latsis Dimitrios|38.2406872|21.7330943|Φαρμακείο|Pharmacy
28|0|Ζαφειρόπουλος Ανδρέας|Zafeiropoulos
Andreas|38.2527044|21.7437915|Φαρμακείο|Pharmacy
29|0|Σκόνδρα Μυρσίνη|Skondra Myrsini|38.2434452|21.733454|Φαρμακείο|Pharmacy
30|0|Παναγιωτοπούλου Κωνσταντίνα|Panagiotopoulou
Konstantina|38.237833|21.736198|Φαρμακείο|Pharmacy
31|0|Χύμας Γεώργιος|Chimas Georgios|38.2425486|21.7537924|Φαρμακείο|Pharmacy
32|0|Τσιμενίδη Καλλίνα|Tsimenidi Kallina|38.2372044|21.7318264|Φαρμακείο|Pharmacy
33|0|Αγγελοπούλου Έφη|Aggelopoulou
Efi|38.2310662|21.7354138|Φαρμακείο|Pharmacy
34|0|Αποστολόπουλος Νικόλαος|Apostolopoulos
Nikolaos|38.2382331|21.732945|Φαρμακείο|Pharmacy
35|0|Βίτσος Χρήστος|Vitsos Christos|38.2443589|21.7345522|Φαρμακείο|Pharmacy
36|0|Τζουραμάνη Βεατρίκη|Tzouramani
Veatriki|38.2454984|21.736019|Φαρμακείο|Pharmacy
37|0|Παπαθανασόπουλος Γεώργιος|Papathanasopoulos
Georgios|38.2481644|21.7368934|Φαρμακείο|Pharmacy
38|0|Θανοπούλου Αθηνά|Thanopoulou
Athina|38.2442784|21.7332343|Φαρμακείο|Pharmacy
39|0|Ματθαίου Γεώργιος|Matthaiou
Georgios|38.2554283|21.7407676|Φαρμακείο|Pharmacy
40|0|∆ελέγκου Μαρία|Delegkou Maria|38.2425012|21.7391076|Φαρμακείο|Pharmacy
41|0|Ζαφειροπούλου Λένα|Zafeiropoulou
Lena|38.2560443|21.7456223|Φαρμακείο|Pharmacy
42|0|Ραβαζούλας Νικόλαος|Ravazoulas
Nikolaos|38.2403821|21.7404436|Φαρμακείο|Pharmacy
43|0|Μακρυγιώργη Μαρία|Makrigiorgi
Maria|38.2195408|21.7414658|Φαρμακείο|Pharmacy
44|0|Καρούσου Αναστασία|Karousou
Anastasia|38.2542492|21.7402373|Φαρμακείο|Pharmacy
45|0|Θεοχάρους Ελένη|Theocharous
Eleni|38.2443271|21.7356817|Φαρμακείο|Pharmacy
46|0|Λιάκου Νίκη|Liakou Niki|38.2495105|21.7361742|Φαρμακείο|Pharmacy
47|0|Νικολαροπούλου Ηλέκτρα|Nikolaropoulou
Ilektra|38.2392607|21.7313563|Φαρμακείο|Pharmacy
48|0|Βουτσινάς Γεράσιμος|Boutsinas
Gerasimos|38.2481346|21.7396457|Φαρμακείο|Pharmacy
49|0|Τσεκούρα Πηνελόπη|Tsekoura
Pinelopi|38.2690413262227|21.7451620101929|Φαρμακείο|Pharmacy
50|0|Τσελέπης Γεώργιος|Tselepis
Georgios|38.243731|21.7331145|Φαρμακείο|Pharmacy
51|0|Ζεϊμπέκη Αφροδίτη|Zeimpeki Afroditi|38.2464581|21.735944|Φαρμακείο|Pharmacy
52|0|Περίδης Αντώνιος|Peridis Antonios|38.2485023|21.734487|Φαρμακείο|Pharmacy
53|0|Σοφιανόπουλος Ανδρέας|Sofianopoulos
Andreas|38.2405901751646|21.7355275154114|Φαρμακείο|Pharmacy
78
54|0|Αλεξοπούλου Ιουλία|Aleksopoulou
Ioulia|38.2346692|21.7350827|Φαρμακείο|Pharmacy
55|0|Παπαϊωάννου Χαρίκλεια|Papaioannou
Chariklia|38.2210564|21.7360245|Φαρμακείο|Pharmacy
56|0|Λαζαράτου Αγγελική|Lazaratou
Aggeliki|38.245788|21.7375467|Φαρμακείο|Pharmacy
57|0|Φιλιππακόπουλος Νικόλαος|Filippakopoulos
Nikolaos|38.2470896|21.7371823|Φαρμακείο|Pharmacy
58|1|Blue Monday|Blue Monday|38.2486111|21.7366747|Καφετέρια-Μπαρ|Cafeteria-Bar
59|1|BARARARA|BARARARA|38.240848|21.7338571|Καφετέρια-Μπαρ|Cafeteria-Bar
60|1|ΙΝΤΕΑΛ|INTEAL|38.2487462|21.7351011|Καφετέρια-Μπαρ|Cafeteria-Bar
61|2|Χάντρες|Xantres|38.2460722|21.7394526|Μεζεδοπωλείο|Mezes restaurant
62|2|Το κουκί & το ρεβύθι|To kouki & to
rebuthi|38.2490986|21.7384308|Μεζεδοπωλείο|Mezes restaurant
63|2|Έπαυλης|Epaulis|38.2409812|21.7330077|Μεζεδοπωλείο|Mezes restaurant
64|2|Κρασοπότηρο|Krasopotiro|38.2471445|21.7408261|Μεζεδοπωλείο|Mezes
restaurant
65|2|Τα βαρέλια|Ta varelia|38.2445552|21.737684|Μεζεδοπωλείο|Mezes restaurant
66|2|Sakis Bistro|Sakis Bistro|38.2504725|21.7384879|Μεζεδοπωλείο|Mezes restaurant
67|2|Μεζεδοτεχνείον|Mezedotechnion|38.2421369|21.7308421|Μεζεδοπωλείο|Mezes
restaurant
68|2|Οινοθήκη Vinum|Inothiki Vinum|38.2441239|21.7354741|Μεζεδοπωλείο|Mezes
restaurant
69|2|Απέριττο|Aperitto|38.2465283|21.7378728|Μεζεδοπωλείο|Mezes restaurant
70|2|Πεινώκιο|Pinokio|38.241724|21.7316462|Μεζεδοπωλείο|Mezes restaurant
71|2|Μαρκάτο Οίνου Μέλαθρον|Markato Oinou
Melathron|38.241938|21.7315849|Μεζεδοπωλείο|Mezes restaurant
72|2|Due Piani|Due Piani|38.2473982|21.7367968|Μεζεδοπωλείο|Mezes restaurant
73|2|Ούζου Μέλαθρον|Ouzou Melathron|38.2408984|21.7336807|Μεζεδοπωλείο|Mezes
restaurant
74|2|Σινιάλο|Sinialo|38.2467942|21.7388713|Μεζεδοπωλείο|Mezes restaurant
75|2|Χάντρες|Xantres|38.2460722|21.7394526|Μεζεδοπωλείο|Mezes restaurant
76|2|Salumeria|Salumeria|38.2456166|21.7333576|Μεζεδοπωλείο|Mezes restaurant
77|3|GOODY'S|GOODY'S|38.2405397|21.7349896|Ταχυφαγείο|Fast food
78|3|Everest|Everest|38.2759694|21.762259|Ταχυφαγείο|Fast food
79|3|GOODY'S|GOODY'S|38.2376407957712|21.7259895801544|Ταχυφαγείο|Fast food
80|3|SNOOPY|SNOOPY|38.2507933|21.7373516|Ταχυφαγείο|Fast food
81|3|Everest|Everest|38.248252|21.7357171|Ταχυφαγείο|Fast food
82|3|Mangiare|Mangiare|38.2406997212376|21.734025478363|Ταχυφαγείο|Fast food
83|3|FAMILY|FAMILY|38.2425582|21.7347634|Ταχυφαγείο|Fast food
84|3|HOT|HOT|38.244895|21.736734|Ταχυφαγείο|Fast food
85|3|Mr Burger|Mr Burger|38.2503055|21.7368014|Ταχυφαγείο|Fast food
86|3|Γρηγόρης|Grigoris|38.2456747|21.7348991|Ταχυφαγείο|Fast food
87|3|GOODY'S|GOODY'S|38.249399|21.7380516|Ταχυφαγείο|Fast food
88|3|WOODY|WOODY|38.2362277|21.7371977|Ταχυφαγείο|Fast food
89|3|Γρηγόρης|Grigoris|38.2257577984176|21.7235219478607|Ταχυφαγείο|Fast food
79
90|3|SWEETY|SWEETY|38.2268332|21.7374789|Ταχυφαγείο|Fast food
91|4|Άγιος ∆ιονύσιος|Agios
Dionisios|38.2538356265433|21.7387890815735|Εκκλησία|Church
92|4|Άγιος Κωνσταντίνος και Ελένη|Agios Konstantinos kai
Eleni|38.2693698353001|21.747522354126|Εκκλησία|Church
93|4|Άγιος Παύλος|Agios
Pavlos|38.2369497810148|21.7330706119537|Εκκλησία|Church
94|4|Αγία Παρασκευή (Νεκροταφείο)|Santa Paraskevi
(Cemetary)|38.2604574470705|21.7523074150085|Εκκλησία|Church
95|4|Άγιος Ανδρέας - Αγγλικάνικός|Protestant Church of San
Andrea|38.251779875035|21.7378342151642|Εκκλησία|Church
96|4|Άγιος Παντελεήμων|San
Panteleimon|38.2781969073929|21.7626714706421|Εκκλησία|Church
97|4|Άγιος Γεώργιος|Agios
Georgios|38.2260696465582|21.7492926120758|Εκκλησία|Church
98|4|Αγία Παρασκευή|Santa
Paraskevi|38.2391997683568|21.7463314533234|Εκκλησία|Church
99|4|Αγία Αικατερίνη|Agia
Aikaterini|38.2388542692075|21.7409133911133|Εκκλησία|Church
100|4|Αγία Τριάδα|Agia Triada|38.2351969336405|21.7384135723114|Εκκλησία|Church
101|4|Ευαγγελίστρια (Μητρόπολη)|Evaggelistria
(Cathedral)|38.2474862|21.7360756|Εκκλησία|Church
102|4|Άγιος Γεράσιμος|Agios
Gerasimos|38.2355508773803|21.7256784439087|Εκκλησία|Church
103|4|Άγιος Φανούριος|Agios
Fanourios|38.2524370478244|21.7474043369293|Εκκλησία|Church
104|4|Άγιος Νεκτάριος|Agios
Nektarios|38.2291880544337|21.7428982257843|Εκκλησία|Church
105|4|Άγιοι Απόστολοι|Agii Apostoli|38.2253818|21.722152|Εκκλησία|Church
106|4|Αγία Βαρβάρα|Agia Barbara|38.2383116|21.7306503|Εκκλησία|Church
107|4|Άγιος Νικόλαος|Agios
Nikolaos|38.245519585041|21.7394542694092|Εκκλησία|Church
108|4|Αγία Σοφία|Santa Sofia|38.2566158536948|21.7440891265869|Εκκλησία|Church
109|4|Άγιος Λάζαρος|Agios
Lazaros|38.2383318039606|21.7495179176331|Εκκλησία|Church
110|4|Άγιοι Ανάργυροι|Agii Anargiri|38.2411029|21.7380241|Εκκλησία|Church
111|4|Έδρα Μητρόπολης|Head Office of Patras Diocese
|38.2423260396755|21.7287361621857|Εκκλησία|Church
112|4|Μεταμόρφωσης Σωτήρος|Metamorfosis
Sotiros|38.2350368156685|21.7302274703979|Εκκλησία|Church
113|4|Άγιος Αθανάσιος|Agios
Athanasios|38.237581806963|21.7458486557007|Εκκλησία|Church
114|4|Άγιος Ανδρέας (Παλαιός Ναός)|Αgios Andreas (Old
church)|38.2424861415962|21.7272019386292|Εκκλησία|Church
115|4|Εισοδίων της Παναγίας|Eisodion tis
Panagias|38.2441376987248|21.7388534545898|Εκκλησία|Church
80
116|4|Αγία Φωτεινή|Agia
Foteini|38.2342530752454|21.7412996292114|Εκκλησία|Church
117|4|Άγιος ∆ημήτριος|Agios Dimitrios|38.2406726|21.7415788|Εκκλησία|Church
118|4|Παντοκράτορας|Pantokratoras|38.2429917242939|21.7404627799988|Εκκλησία|
Church
119|4|Παντάνασσα|Pantanassa|38.2435478612004|21.7355918884277|Εκκλησία|Churc
h
120|4|Άγιος Ανδρέας - Ιερός Ναός|Saint Andrew Cathedral|38.2424861415962|21.7278563976288|Εκκλησία|Church
121|4|Άγιος Ιωάννης Πράτσικα|Agios Ioannis
Pratsika|38.2321462042787|21.7358922958374|Εκκλησία|Church
122|4|Άγιος Ελευθέριος|Saint
Eleftherios|38.2695719939938|21.756899356842|Εκκλησία|Church
123|4|Άγιος Αλέξιος|Agios
Alexios|38.2563209861608|21.7415463924408|Εκκλησία|Church
124|4|Άγιος Ανδρέας - Καθολικός|Catholic Church of San
Andrea|38.2483322|21.7370938|Εκκλησία|Church
125|5|Olympic star|Olympic star|38.2470111|21.7372811|Ξενοδοχείο 2 αστέρων|2-star
hotel
126|5|Acropole|Acropole|38.2492155|21.7353538|Ξενοδοχείο 2 αστέρων|2-star hotel
127|5|Marie Palace|Marie Palace|38.2457944|21.7306943|Ξενοδοχείο 2 αστέρων|2-star
hotel
128|5|El Greco|El Greco|38.2458488|21.731204|Ξενοδοχείο 2 αστέρων|2-star hotel
129|5|Delfini|Delfini|38.2680473666316|21.7394864559174|Ξενοδοχείο 2 αστέρων|2star hotel
130|5|Adonis|Adonis|38.251096|21.7371235|Ξενοδοχείο 2 αστέρων|2-star hotel
131|5|Atlanta|Atlanta|38.2506825|21.7375801|Ξενοδοχείο 2 αστέρων|2-star hotel
132|5|Mediteranee|Mediteranee|38.2481725|21.7358192|Ξενοδοχείο 2 αστέρων|2-star
hotel
133|6|Κέντρο Νοσημάτων Θώρακος Νοτιοδυτικής Ελλάδος|Center for Chest
Diseases|38.2348640564085|21.7671132087708|Νοσοκομείο|Hospital
134|6|409 Στρατιωτικό Νοσοκομείο|409 Ex-Military
Hospital|38.2377334923731|21.755998134613|Νοσοκομείο|Hospital
135|6|Περιφερειακό Πανεπιστημιακό Γενικό Νοσοκομείο|University
Hospital|38.2952163132658|21.7958128452301|Νοσοκομείο|Hospital
136|6|Περιφερειακό Γενικό Κρατικό Νοσοκομείο - Άγιος Ανδρέας|District General
Hospital - San Andreas|38.2349104064942|21.747350692749|Νοσοκομείο|Hospital
137|6|Σταθμός Πρώτων Βοηθειών ΕΕΣ|Red Cross First Aid
Station|38.2521028|21.7381026|Νοσοκομείο|Hospital
138|6|Καραμανδάνειο Νοσοκομείο Παίδων|Karamandanio Infant
hospital|38.2376239418308|21.7607188224792|Νοσοκομείο|Hospital
81
ΠΑΡΑΡΤΗΜΑ ΙI – ΠΛΑΤΦΟΡΜΑ & ΕΡΓΑΛΕΙΑ ΑΝΑΠΤΥΞΗΣ
Αρχικά εγκαθιστούμε το πακέτο ανάπτυξης Java Development Kit (JDK).
Κάνουμε κλικ στο αρχείο εγκατάστασης με αποτέλεσμα να εμφανιστεί το
παρακάτω πλαίσιο.
Εικόνα π-1:Εγκατάσταση του Java Development Kit (1/5)
Σε αυτό το πλαίσιο επιλέγουμε και πατάμε Next.
82
Εικόνα π-2: Εγκατάσταση του Java Development Kit (2/5)
Εδώ επιλέγουμε Development Tools και πατάμε Next.
Εικόνα π-3: Εγκατάσταση του Java Development Kit (3/5)
83
Αυτή η ενέργεια έχει ως αποτέλεσμα την εκκίνηση της εγκατάστασης του
Java Development Kit.
Εικόνα π-4: Εγκατάσταση του Java Development Kit (4/5)
Όταν ολοκληρωθεί η εγκατάσταση του Java Development Kit εμφανίζεται
το ακόλουθο πλαίσιο.
84
Εικόνα π-5: Εγκατάσταση του Java Development Kit (5/5)
Έπειτα εγκαθιστούμε το Eclipse. Κάνουμε διπλό κλικ στο αρχείο
εγκατάστασης του Eclipse, με αποτέλεσμα την εμφάνιση του παρακάτω
πλαισίου.
Εικόνα π-6:Εγκατάσταση του Eclipse (1/3)
Επιλέγουμε την κατεύθυνση που θέλουμε να το έχουμε και μετά πατάμε
ΟΚ ώστε να μεταβούμε στο επόμενο πλαίσιο.
85
Εικόνα π-7: Άνοιγμα του Eclipse (2/3)
Εικόνα π-8: Αρχική οθόνη του Eclipse (3/3)
86
Σε αυτό το σημείο πηγαίνουμε στο Start Eclipse, έπειτα επιλέγουμε Help
> Install New Software, κάνουμε κλικ στο κουμπί Add στην επάνω δεξιά γωνία,
Στο
παράθυρο
διαλόγου
Προσθήκη
Repository
που
εμφανίζεται,
πληκτρολογούμε "ADT Plugin" για το όνομα και την ακόλουθη διεύθυνση URL
για τη γεωγραφική θέση του «https://dl-ssl.google.com/android/eclipse/» έπειτα
OK,NEXT και FINISH στα επόμενα παράθυρα. Το ADT (Android Developer
Tools) είναι ένα plugin για το Eclipse IDE που έχει σχεδιαστεί για να μας δώσει
ένα ισχυρό, ολοκληρωμένο περιβάλλον στο οποίο να οικοδομήσουμε Android
εφαρμογές.
Το επόμενο βήμα είναι η εγκατάσταση και ρύθμιση του Android SDK και
του AVD Manager που ενσωματώνονται στο Eclipse.
Εικόνα π-9: Android SDK
Εδώ επιλέγουμε ποια APΙ και τι εργαλεία θέλουμε να κάνουμε install τα
τσεκάρουμε και προχωράμε.
87
Εικόνα π-10: AVD Manager
Εδώ γίνεται η ρύθμιση παραμέτρων ενός AVD όπου περιγράφεται ο
τύπος της συσκευής που θέλουμε να προσομοιάσει ο εξομοιωτής όπως και
ποια πλατφόρμα Android πρέπει να υποστηρίξει. Κάνοντας κλικ στο κουμπί
New βλέπουμε την παρακάτω οθόνη όπου μπορούμε να δημιουργήσουμε ένα
προφίλ AVD και να καθορίσουμε διαφορετικά μεγέθοι και διατάξεις οθόνης και
αν ο εξομοιωτής έχει ή όχι κάρτα μνήμης SD και, αν ναι, ποια είναι η
χωρητικότητα της.
Εικόνα π-11: ∆ημιουργία νέου AVD Manager
88
© Copyright 2026 Paperzz