ΤΕΙ ΚΑΒΑΛΑΣ ΤΜ ΗΜ Α ΒΙΟΜΗΧΑΝΙΚΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2009-2010 ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ 0ΕΜΑ:ΕΦΑΡΜΟΓΗ GOOGLE MAPS ΣΕ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΠΗΜ Α ADROID OS ΟΝΟΜΑΤΕΠΩΝΥΜΟ ΣΠΟΥΔΑΣΤΩΝ 1)ΚΟΥΤΣΟΓΙΑΝΝΗΣ ΧΡΥΣΟΒΑΛΑΝΤΗΣ ΑΕΜ 810 2)ΒΕΡΡΟΣ ΚΥΡΙΑΚΟΣ ΑΕΜ 1105 rw rvfa4kh 2 ^"Τν/Μ Μ ΟΣ ΚΑΒΑΛΑ 2010
Περιεχόμενα Στόχον 1 Android 2 Αρχιτεκτονική Android 3 Google Maps API 4 Eclipse 5 Δημιουργία της Εφαρμογής 7 Αρχείο Manifest.xml 8 Permissions 9 Layout 9 Συγγραφή μιας Activity 10 Δημιουργία Κλειδιού για την εκτέλεση της εφαρμογής 11 Έναρξη ενεργοποίησης του GPS 12 Η προσομοίωση ενός GPS στίγματος με DDMS 13 Εναλλαγή από χάρτη σε φωτογραφία Δορυφόρου 15 Δημιουργία menu 17 Δημιουργία και χειρισμός εναλλαγών δύο Activities 18 Αποστολή δεδομένων από μία Activity στην άλλη 20 Δημιουργία διαδρομής και σχεδιασμός πάνω στον χάρτη 23 Εμφάνιση οδηγιών προς ανάγνωση 28 Εισαγωγή εικονιδίου για την εφαρμογή 29 Σχεδιάγραμμα UML για όλες τις κλάσεις 30 Διάγραμμα ετηκοινωνίας των κλάσεων μεταξύ τους 31 Διάγραμμα ενεργειών από τον χρήστη ή το GPS 32 Διάγραμμα ροής δεδομένων 33 Εγκατάσταση του Eclipse 34 Εγκατάσταση του Android στο Eclipse 34 Ρυθμίσεις περιβάλλοντος 35 Παραμετροποίηση του Eclipse με Android 35 Εγκατάσταση σε Συσκευή 37
Στόχος της Πτυχιακής Στόχος τούτης της πτυχιακής εργασίας είναι η ανάπτυξη μιας εφαρμογής για το λειτουργικό σύστημα κινητών τηλεφώνων, που φέρει το όνομα Android. Ετηπλέον η εφαρμογή αυτή στοχεύει στην χρήση της βιβλιοθήκης της Google που συσχετίζεται με τους χάρτες και τις λοιπές υπηρεσίες που παρέχει. Αυτή η βιβλιοθήκη φέρει το όνομα Google Maps API. Η πτυχιακή εργασία ξεκινάει με μία εισαγωγή στο Android. Στη συνέχει γίνετε αναφορά για την Google Maps API και την Eclipse. Στο κύριο μέρος της πτυχιακής περιγράφουμε πως αναπτύχθηκε η εφαρμογή, με κάθε λεπτομερή αναφορά για τα ενδιάμεσα στάδια. Σε αυτή την ενότητα υλοποιούνται όλοι οι στόχοι που τέθηκαν. 1. Προσδιορισμός θέσης της συσκευής-εφαρμογής. (Μέσα από την ενεργοποίηση του GPS) 2. Εμφάνιση της θέσης στον χάρτη. (Χρήση Google Maps API) 3. Εισαγωγή προορισμού. 4. Εμφάνιση προορισμού στον χάρτη. 5. Υπολογισμός διαδρομής. 6. Αποτύπωση διαδρομής στον χάρτη. 7. Παρακολούθησης πορείας της συσκευής-εφαρμογής. Ετηπρόσθετα υλοποιήθηκαν: 1. Εναλλαγή από συμβατό χάρτη σε φωτογραφίες δορυφόρου. 2. Σηματοδότηση θέσης και προορισμού με γραφικά. 3. Εικονίδιο για την εφαρμογή. Η εφαρμογή υλοποιήθηκε σε προγραμματιστικό περιβάλλον Eclipse και με γλώσσα προγραμματισμού Java.
Android To Android είναι λειτουργικό σύστημα για συσκευές κινητής τηλεφωνίας το οποίο τρέχει τον πυρήνα του λειτουργικού Linux. Αρχικά αναπτύχθηκε από την Google και αργότερα από την Open Handset Alliance. Επιτρέπει στους κατασκευαστές λογισμικού να συνθέτουν κώδικα με την χρήση της γλώσσας προγραμματισμού Java, ελέγχοντας την συσκευή μέσω βιβλιοθηκών λογισμικού ανεπτυγμένων από την Google. Η πρώτη παρουσίαση της πλατφόρμας Android έγινε σης 5 Νοεμβρίου 2007, παράλληλα με την ανακοίνωση της ίδρυσης του οργανισμού Open Handset Alliance, μιας κοινοπραξίας 48 τηλεπικοινωνιακών εταιριών, εταιριών λογισμικού καθώς και κατασκευής υλικού, οι οποίες είναι αφιερωμένες στην ανάπτυξη και εξέλιξη ανοιχτών προτύπων σης συσκευές κινητής τηλεφωνίας. Η Google δημοσίευσε το μεγαλύτερο μέρος του κώδικα του Android υπό τους όρους της Apache License, μιας ελεύθερης άδειας λογισμικού.
J Android Αρχιτεκτονική To παρακάτω διάγραμμα παρουσιάζει τα κυρτότερα συσταηκά του λειτουργικό σύστημα. Κάθε τμήμα περιγράφεται αναλυτικότερα παρακάτω. Εφαρμογές του Android Το Android κυκλοφορεί με ένα σύνολο βασικών εφαρμογών, όπως έναν τιελάτη ηλεκτρονικού ταχυδρομείου, SMS, ημερολόγιο, χάρτες, μηχανή αναζήτησης, επαφές, και άλλα.
Google Maps API To Google δημιούργησε το Google Maps API για να ετατρέψει στους προγραμματιστές να ενσωματώσουν Χάρτες της Google σε ιστοσελίδες με δικά τους δεδομένα. Είναι μια ελεύθερη υττηρεσία, και εττί του παρόντος δεν περιέχει διαφημίσεις, αλλά το Google ορίζει τους στην όροι χρήσης ότι διατηρούν το δικαίωμα να προβάλλουν διαφημίσεις στο μέλλον. Με τη χρήση του Google Maps API, είναι δυνατόν να ενσωματωθεί όλες οι δυνατότητες της Google Maps σε έναν εξωτερικό δικτυακό τόπο. Κατασκευαστές οφεϋ,ουν να ζητήσουν API κλειδί, με το οποίο συνδέεται με τον δικτυακό τόπο. Application Framework Η ύπαρξη ανοικτής πλατφόρμας ανάπτυξης Android, προσφέρει στους προγραμματιστές τη δυνατότητα κατασκευής εξαιρετικά πλούσιων και καινοτόμων εφαρμογών. Προγραμματιστές έχουν τη δυνατότητα να επωφεληθούν από το υλικό της συσκευής. Επίσης έχουν πλήρη πρόσβαση στην ίδια API που χρησιμοποιείται από τις εφαρμογές του πυρήνα. Χαρακτηριστικά Λειτουργίες Οθόνης: Η πλατφόρμα είναι προσαρμόσιμη σε μεγαλύτερο, VGA ανάλυση, δισδιάστατες ψηφιακές γραφικές βιβλιοθήκες, τρισδιάστατα γραφικά βασισμένα στην OpenGL ES 1.0 έκδοση χαρακτηριστικών, καθώς και παραδοσιακές απεικονίσεις οθόνης "έξυπνων" συσκευών κινητής τηλεφωνίας. Αποθήκευση Δεδομένων; Χρήση βάσης δεδομένων SQLite για τις ανάγκες αποθήκευσης. Συνδεσιμότητα; Το Android υποστηρίζει τεχνολογίες συνδεσιμότητας συμπεριλαμβανομένου GSM/EDGE, CDMA, EV-DO, UMTS, Bluetooth και Wi-Fi. Αποστολή μηλ-υμάτων: SMS και MMS είναι οι διαθέσιμοι τρόποι ανταλλαγής μηνυμάτων. Περιήγηση στον Ιστό: Για την περιήγηση στον ιστό το Android διαθέτει ένα φυλλομετρητή βασισμένο στην ανοιχτή τεχνολογία WebKit. Υποστήριξη Java: Λογισμικό γραμμένο στην Java είναι δυνατόν να μεταγλωττιστεί και να εκτελεστεί στην εικονική μηχανή Dalvik, η οποία είναι μια εξειδικευμένη υλοποίηση εικονική μηχανής, σχεδιασμένη για χρήση σε φορητές συσκευές, παρόλο που δεν είναι μια πρότυπη εικονική μηχανή Java. Υποστήριξη Πολυμέσων: Το λειτουργικό Android υποστηρίζει τις ακόλουθα μορφές ήχου, στατικής και κινούμενης εικόνας: Η.263, Η.264 (σε 3GP ή MP4), MPEG-4, AMR, AMR-WB, AAC, HE-AAC, MP3, MIDI, OGG, WAV, JPEG, PNG, GIF, BMP. Επιπλέον υποστήριξη hardware: To λειτουργικό Android μπορεί να συνεργαστεί με κάμερες στατικής ή κινούμενης εικόνας, οθόνες αφής, GPS,
αισθητήρες ετητάίίυνσης, μαγνητόμετρα, δισδχάστατους καθώς και τρισδιάστατους επιταχυντές γραφικών. Περιβά^νΟν Ανάπτυξης Λογισμικού; Περιλαμβάνει ένας προσομοιωτή συσκευής, εργαλεία για διόρθωση σφαλμάτων, μνήμη και εργαλεία ανάλυσης της απόδοσης του εκτελέσιμου λογισμικού καθώς και ένα ετηπρόσθετο για το Eclipse. Αγορά και Εγκατάσταση Εφαρμογών: Παρόμοια με το Αρρ Store του iphone OS, το Android Market είναι ένας κατάλογος εφαρμογών που μπορούν να μεταφορτωθούν και εγκατασταθούν στην συσκευή άμεσα μέσω ασύρματων καναλιών, χωρίς την χρήση υπολογιστή. Αρχικά μόνο δωρεάν εφαρμογές ήταν δυνατόν να εγκατασταθούν. Εφαρμογές ετή πληρωμή ήταν μετέπειτα διαθέσιμες στο Android Market στις ΗΠΑ ύστερα από τις 19 Φεβρουαρίου 2009. Οθόνη Αφής Πο>^Λίπλών Σημείων; Το λειτουργικό Android είχε εξ ορισμού υποστήριξη για οθόνες πολλαπλών σημείων αλλά η δυνατότητα αυτή έχει κλειδωθεί σε επίπεδο πυρήνα (τηθανόν για αποφυγή παραβιάσεων των πατεντών λογισμικού της Apple στις τεχνολογίες οθονών αφής). Eclipse Το Eclipse είναι ένα περιβάλλον ανάπτυξης λογισμικού για πολλές γλώσσες προγραμματισμού. Γράφτηκε αρχικά για την γλώσσα Java και αργότερα προστέθηκε η δυνατότητα προγραμματισμού των C/C++, Python, Cobol, Perl και ΡΗΡ. Αρχιτεκτονική Το Eclipse λειτουργεί με plug-ins για την παροχή όλων των λειτουργιών της, εκτός από έναν πυρήνα εκτέλεσης, σε αντίθεση με κάποιες άλλες εφαρμογές, όπου όλες οι λειτουργίες τους είναι συνήθως ενσωματωμένες στον πυρήνα. Ο πυρήνας εκτέλεσης του Eclipse βασίζεται σε Enquinox, ένα πρότυπο OSGi. Αυτός ο plug-in μηχανισμός είναι ένα ελαφρύ πλαίσιο λογισμικού. Η Eclipse επεκτάθηκε σε τέτοιους μηχανισμούς ώστε να μπορεί να υποστιρίζει και άλλες γλώσσες προγραμματισμού όπως τη C και Python. Επίσης το plug-in-πλαίσιο την επιτρέπει να συνεργαστεί με στοιχειοθεσία γλώσσες, όπως η LaTeX, εφαρμογές δικτύωσης, όπως το telnet, και συστήματα διαχείρισης βάσεων δεδομένων. Η plug-in αρχιτεκτονική υποστηρίζει οποιαδήποτε ετηθυμητή επέκταση προς το περιβάλλον της. Η Java υποστηρίζεται από την αντίστοιχη Eclipse SDK. Με την εξαίρεση μιας μικρής ηιη-ττυρήνα του χρόνου, τα πάντα στο Eclipse είναι ένα plug-in. Η Eclipse παρέχει plug-ins για μια ευρεία ποικιλία χαρακτηρισηκών, μερικά από τα οποία, μέσω τρίτων, χρησιμοποιούνται τόσο από ελεύθερα όσο και από εμπορικά μοντέλα. Παραδείγματα των plug-ins περιλαμβάνουν UML διαγράμματα, plug-in για εξερευνητή βάση δεδομένων, και πολλά άλλα. Το Eclipse SDK περιλαμβάνει το Eclipse Java Development Tools (JDT), προσφέροντας ένα IDE με ένα ενσωματωμένο compiler Java και ένα τιλήρες μοντέλο των αρχείων προέλευσης Java. Το Visual Editor επιτρέτιει διασυνδέσεις που πρόκειται να δημιουργηθούν διαδραστικά, ετητρέποντας έτσι να χρησιμοποιηθεί ως
εργαλείο RAD. Τα widgets Eclipse είναι σε εφαρμογή από ένα σύνολο εργαλείων widget για Java που ονομάζεται SWT, σε αντίθεση με τις περισσότερες εφαρμογές Java, οι οποίες χρησιμοποιούν το πρότυπο Java Abstract Window Toolkit (AWT) ή Swing. H Διεπαφή χρήστη - Eclipse χρησιμοποιεί ένα ενδιάμεσο στρώμα GUI που ονομάζεται JFace, το οποίο απλοποιεί την κατασκευή των εφαρμογών που βασίζονται σε SWT. Γλώσσα πακέτα παρέχει μεταφράσεις σε πάνω από μια ντουζίνα φυσικό γλώσσες.
Δημιουργία της εφαρμογής Από την ετηλογή File New Android Project εμφανίζετε ένα παράθυρο (Εικόνα 1) στο οποίο συμπληρώνουμε τα βασικά στοιχεία του Project, όπως είναι το όνομα, η τοποθεσία του πηγαίου κώδικα κτλ. Στο τιλαίσιο του Build Target επιλέγουμε το Google APIs επειδή θα χρησιμοποιήσουμε την βιβλιοθήκη της Google. Στο πλαίσιο Properties βαπτίζουμε την εφαρμογή, το πακέτο που θα είναι κοινό για όλα τα αντικείμενα του κώδικά μας και την κύρια Activity της εφαρμογής μας.
Η Activity είναι οντότητα που χρησιμοποιείται για την εκτέλεση δράσεων ή πράξεων μιας εφαρμογής. Μία εφαρμογή μπορεί να έχει πολλές Activities, αώλ ο χρήστης δρα πάντα πάνω σε μία από αυτές κι όχι ταυτόχρονα σε όλες.[1] i-t Goo^MapsAppScation assets & bin fe gen [Generated Java Files] S res drawaue : : e B & layout Bmain.xnJ a* AndroldManifest.xitil 11 default,properties Q newlab03 Πατώντας το κουμπί Finish δημιουργεί η Eclipse ένα δέντρο φακέλων με την αντίστοιχη δομή που χρειάζεται για να αναπτυχθεί η εφαρμογή σε Android (Εικόνα 2). Το Eclipse τοποθετεί στους διάφορους φακέλους προκατασκευασμένα αρχεία που διευκολύνουν τον προγραμματιστή να αναπτύξει την εφαρμογή του. Σημαντικό αρχείο για την εκτέλεση του λογισμικού μας είναι το AndroidManifest.xml[2]. Αυτό το αρχείο περιέχει όλες τις παραπομπές σε βιβλιοθήκες, σε άδειες λειτουργίας και άλλες εφαρμογές. Το λειτουργικό σύστημα της android συσκευής διαβάζει ποιες permissions μπορεί να έχει η συγκεκριμένη εφαρμογή. Στην δική μας περίπτωση η ειραρμογή πρέπει να έχει πρόσβαση στο διαδίκτυο και επίσης στο GPS. Με το προγραμματισηκό περιβάλλον Eclipse αυτή η διαδικασία απλοποιείται με τα ακόλουθα βήματα. Στο παράθυρο που φαίνεται στην Εικόνα 3 πατάμε το κουμπί Add και προσθέτουμε την επιθυμητή uses permission[3]. Συγκεκριμένα προσθέτουμε τις Uses permission που φαίνονται
Στη συνέχεια πρέπει να πράξουμε αντίστοιχα για την εισαγωγή της βιβλιοθήκης του google στην εφαρμογή μας. Συγκεκριμένα εκτελούμε Add και προσθέτουμε στο application notes την βιβλιοθήκη com.google.android.maps. Στη συνέχεια πρέτιει να πράξουμε βήματα που θα δημιουργήσουν ένα κλειδί με βάση το οποίο η google θα στέλνει τους χάρτες στο πρόγραμμά μας. Η διαδικασία αυτή γίνεται με ποικίλους τρόπους, αλλά με το eclipse έχει απλοποιηθεί η διαδικασία αυτή. Σαν πρώτη φάση πρέπει να δημιουργήσουμε ένα Layout[4] στο οποίο θα εμφανίζεται ο χάρτης της google. Ανάλογα με τις απαιτήσεις του χρήστη υπάρχουν διάφορα Layout που είναι XML αρχεία μέσα στα οποία εκφράζεται μια δομή με την οποία θα ετηκοινωνεί ο χρήστης με την εφαρμογή. Στην παρούσα περίπτωση αυτό που θα διαλέξουμε είναι RelativLayout που θα περιέχει ένα MapView της gooogle. Η δομή αυτού αποθηκεύεται μέσα σε υποφάκελο layout του φακέλου res της εφαρμογής στο αρχείο main.xml. Στην Εικόνα 2 φαίνεται το δέντρο αρχείων και το αντίστοιχο αρχείο. Σε αυτό λοιπόν γράφουμε το RelativLayout έτσι όπως φαίνεται στο πλαίσιο κειμένου πλαίσιο 1 παρακάτω.?xral version="i.ο" encoding="utf-8"?> <RelativeLayout xmlns:android="h t t p : //s c h e m a s.a n d r o id.c o m /a p k /r e s / a n d r o id " android;layout_width=" f i l l _ p a r e n t " android: layout_height= " f i l l ^ a r e n t "> <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" /> <LinearLayout android:id="@ +id/zoom" android:layout_width=" w ra p _ c o n te n t" android:layout_height=" w r a p jc o n te n t" android:layout_alignparentbottom=" tru e ' android:layout_centerhorizontal=" t r u e " </RelativeLayout>
Ετήσης πρέπει να τροποποιήσουμε αντίστοιχα το αρχείο GoogleMapsApplication.java έτσι ώστε αυτό να γίνει από απλή Activity μια MapActivity (Πλαίσιο 2). package com.google.dimploma.googlemapsapplication; import com.google.android.maps.mapactivity; import android.os.bundle public class GoogleMapsApplication extends MapActivity{ /** Called when the activity is first created. */ Override public void oncreate(bundle savedinstancestate) { super.oncreate (savedinstancestate) setcontentview(r.layout.main); Override protected boolean isroutedisplayed() { // TODO Auto-generated method stub return false; } Πί.αίσιο 2 Στο κώδικα αυτό κατόπιν αλλαγής του extends η Eclipse από μόνη της μας προτείνει την εισαγωγή των βιβλιοθηκών που χρειάζονται για να μην βγάζει σφάλμα ο interpreter της Java. Ποιο σημανπκή γραμμή του κώδικα είναι το σημείο στο οποίο καθορίζεται σαν εμφάνιση της εφαρμογής το main.xml αρχείο, δηλαδή καθορίζουμε ότι ο χρήστης θα δει το Layout του Πλαισίου 1. Για να το αναπτύξουμε λίγο ακόμη ώστε να δούμε και τον χάρτη θα πρέπει να προσθέσουμε ακόμα μία class MapView που ανήκει στην βιβλιοθήκη του google, όπως εττίσης να προσθέσουμε δύο κουμπιά zoom του συστήματος για καλύτερη πλοήγηση. Έτσι καταλήγουμε στον κώδικα του Πλαισίου 3.
Στην οτυνέχενα έχουμε να «υπογράψουμε» ψηφιακά την εφαρμογή μας για να μπορέσουμε να εκτελέσουμε την εφαρμογή στον emulator, αλλά και για να δούμε τον χάρτη της g Μετά την εκτέλεση του build στο Eclipse δημωυργείτε ένα αρχείο debug.keystore που αποθηκεύεται στη θέση C:\Documents and Settings\<user>\.android\debug.keystore. Με την εκτέλεση της εντολής keytool της java δημιουργείται ένας αριθμός που εκφράζεται στο 1 άδικό σύστημα. Στη συνέχεια εγγραφόμαστε στην google και πηγαίνουμε στην ιστοσελίδα http://code.google, com/android/maps-api-signup.html όπου και εισάγουμε τον 16δικό αριθμό μας. Η google μετά μας προβάλλει την παρακάτω σελίδα (Εικόνα 5) από την οποία αντιγράφουμε το apikey και το εισάγουμε στο main.xml αρχείο μας που θα περιέχει το MapView. Τέλος επιλέγουμε από το Eclipse, Run As Android Application και τίθεται σε λειτουργία ο emulator, που θα μας προβάλλει τον χάρτη, σε προεπιλεγμένη από το google τοποθεσία(εικόνα 6).
ο προσομοιωτής του android μας εμφανίζει χάρτη της google maps. Στη δική μας εφαρμογή θέλουμε η εφαρμογή να παίρνει πληροφορίες από το gps γι αυτί 5 το λόγο και είχαμε προσθέσει permission σχετικά με την τοποθεσία μας(εικόνα 4). πρέπει να εμφανίζει το σημείο του στο οποίο βρισκόμαστε. Για να το πετύχι θα πρέπει να προσθέσουμε έναν listener που θα τίθεται σε λειτουργία ότα τιμές από το gps(πλαίσιo 4, Πλαίσιο 5)[7].
ivate final LocationListener locationlisten 0 liocationlist pxiblic void onlocationchanged(location loc if (loc!= null){ MapController me = mapview.getcont oiler - - ct(get- "Location changed : Lat: " + loc.getlatitude() + " Lng: " + loc.getlongitude(), Toast.LENGTH_SH0R1^. show (); GeoPoint mypoint = new GeoPoint((int) (loc.getlatitude( c.getlongitudeo * 1E6)); mc-setzoomdett ubli ubl d onstatuschanged(stri Πλαίσιο 5 Στο πλαίσιο 5 φαίνεται ο κώδικας των αυτόματα παραγόμενων listener που μας παρέχουν την δυνατότητα να ελέγχουμε τις εισόδους του GPS. Στο σημείο αυτό μπορούμε να αναφέρουμε το LOG που είναι μία μορφή εξόδου του προγράμματος που φαίνεται στην consola της eclipse[6]. Με αυτό τον τρόπο μπορούμε να εξάγουμε τιμές, τις οποίες και θα παρακολουθούμε. Όταν στη συνέχεια εκτελούμε το project μας, στον emulator εμφανίζεται πάλι στην αρχή η Αμερική, ενώ λοιπόν εκτελείτε η εφαρμογή μας εμείς πατάμε το DDMS και μεταφερόμαστε στην πλατφόρμα που ελέγχει τον προσομοιωτή. Στο tap emulator controls επιλέγουμε το manual και τροποποιούμε τις συντεταγμένες latitude και longtitude. Δίνουμε τις αντίστοιχες τιμές (40.929306, 24.379255) και πατάμε send. (Προσοχή στην καταχώρηση, διότι μπορεί να μ^ρδέψετε το latitude με το longtitude και να βρεθούμε κυριολεκτικά στην έρημο!!!)(εικόνα 7 και 8)0 emulator μας τότε προσομοιώνει την ύπαρξη του GPS και τίθεται σε λειτουργία ο κώδικας onlocationchanged (Πλαίσιο 5).
Στη συνέχεια η εφαρμογή μετακινείται και εστιάζει στο σημείο των συντεταγμένων και προβάλλεται η σχεηκή αλλαγή της τοποθεσίας. Ταυτόχρονα στην console Log εμφανίζονται τα αντίστοιχα μηνύματα που εξάγει ο κώδικας (Εικόνα 9). προβάλλονται στις Εικόνες 7 και 6. Η Google Maps παρέχει όμως την δυνατότητα να προβάλλει αντίστοιχες φωτογραφίες από δορυφόρο. Στην συνέχεια θα περιγράφουμε πώς θα χτίσουμε το πρώτο μας Menu από το οποίο και θα επιλέγει ο χρήστης πώς θα προβάλλεται στην οθόνη. Στον φάκελο res που φαίνεται στην Εικόνα 2 προσθέτουμε έναν φάκελο menu. (Πατάμε πάνω στο res δεξί κουμπί και new folder). Μέσα στον φάκελο δημιουργούμε ένα αρχείο options menu.xml και μετά κάνουμε Add ένα Item με όνομα swapview.
Στο androidititle γράφουμε αυτό που θα βλέττει ο χρήστης Change View και από κάτω @+id/swapview (EiK0va 10). Το περιεχόμενο του αρχείου options_menu.xml θα πρέπει να είναι αυτό που φαίνεται στο Πλαίσιο 6. <?χπι1 version="i. 0" encoding= "UTF-8 "?> xmlns:android="h t t p : //s c h e m a s.a n d r o id.c o m /a p k /r e s /a n d r o id ": <item android:id="@+id/swapview" android:title="change View"></item> Μετά πηγαίνουμε στο αρχείο GoogleMapsApplication.java και συμπληρώνουμε με τα ακόλουθα κομμάτια (Πλαίσιο 7)[8],
/* Creates the menu items */ public boolean oncreateoptionsmenu(menu menu) { menu.add(0, R.id.swapview, 0, "Change View"); menu.getitem(0).setonmenuitemclicklistener(menuitemclic)tlistener); return true; } /* Allazei apo Satellite View ^ Street View kai antistrofa private OnMenuItemClickListener menuitemclicklistener= i OnMenuItemClickListener0{ public boolean onmenuitemclick(menultem item) { changeviewo ; return false; }; /*Ypoproqramma pou allazei to apo Satellite se antistrofa */ private void changeview(){ if(mapview.issatellite()){ mapview.setstreetview(true); mapview.setsatellite(false); } else{ mapview.setsatellite(true); mapview.setstreetview(false); StreetView kai Τα λάθη που προκύπτουν κατά την εισαγωγή του κώδικα αναιρούνται και συμπληρώνονται με την βοήθεια της eclipse. Πατώντας στο υπογραμμισμένο κείμενο (δεξί κουμπί) η eclipse προτείνει λύσεις και αυτόματες εισαγωγές βιβλιοθηκών κτλ. Μετά την εισαγωγή αυτή όταν θα εκτελέσουμε τον κώδικα φαίνεται η εφαρμογή όπως στην παρακάτω εικόνα 11.
Σε αυτό το σημείο της πτυχιακής πρέπει να εισάγουμε μία Activity που θα περιέχει ένα πλαίσιο κειμένου, ένα κουμπί ΟΚ και ένα κουμπί Cancel. Σε αυτή την Activity ο χρήστης θα εισάγει τον προορισμό του. Προφανώς αυτό το «παράθυρο» διαλόγου θα πρέπει να ενεργοποιείται από τον χρήστη στην Activity MapView στην οποία βρίσκεται. Οπότε έχουμε να εισάγουμε κι ένα κουμπί ετηπλέον στο menu της. Θα κινηθούμε όμοια όπως με την προηγούμενη φορά. Προσθέτουμε στην συνάρτηση oncreateoptionsmenu επιπλέον κουμπί που θα παραπέμπει στην ενεργοποίηση του Activity με όνομα StreetView. Επίσης αντιστοιχούμε στο κουμτή του menu έναν listener(πλαίσιo 8). /* Creates the menu items */ public boolean oncreateoptionsmenu(menu menu) { menu.add(0, R.id.swapview, 0, "Change View"); menu.addd, R. id. strview, 0, "Drive to.."); menu.getitem(0).setonmenuitemclicklistener(menuitemclicklistener); menu.getitem{1).setonmenuitemclicklistener(strviewclicklistener); return true; } private OnMenuItemClickListener strviewclic)ilistener= new OnMenuItemClicJcListener () { public boolean onmenuitemclick(menultem item) { Intent intent = new Intent(GoogleMapsApplication.this, StreetView.class) ; startactivityforresult(intent, GET_CODE); irn true ; } 1 ; Πλαίσιο 8 Ενημερώνομε μετά το αντίστοιχο xml αρχείο στο φάκελο res->menu->options_menu προσθέτοντας ένα item μέσα(πλαίσιο 9). <?xml version= "1.0" encoding= "C7TF-8"?> <menu xmlns;android="h t t p : / / s c h e m a s. a n d r o id.c o m /a p k /r e s /a n d r o id "> <item android:id="@+id/swapview" android:title="change View"></item> <item android:id=" +id/strview" android:title="drive to..."></item> Πλαίσιο 9 Τώρα μας μένει να κατασκευάσουμε πρώτα το xml αρχείο μέσα από το οποίο θα εκτελείται η κλάση StreetView. Πηγαίνουμε λοιπόν στο φάκελο res->layout και δημιουργούμε ένα αρχείο seaγch.xml(πλαίσιo 10). Σε αυτό το αρχείο ορίζονται τα αντίστοιχα label καθώς και τα 2 κουμπιά Ok, Cancel και το EditText μέσα στο οποίο θα γράψει ο χρήστης την οδό.
<?xml versions 1.Ο" encodings"utf-8"?> <RelativeLayout xmlns:androids"h t t p : //s c h e m a s. a n d r o id.c o m /a p k /r e s /a n d r o id " android:layout_width= " f i l l _ p a r e n t" android:layout_heights" f i l l _ p a r e n t"> <TextView android:ids" + id /la b e l" android:layout_width="f i l l _ p a r e n t " android:layout_heights"w r a p _ c o n te n t" android:texts" L a b e l: "></TextView> <EditText android:id=" @ + id /e n try " android:layout_widths"f i l l _ p a r e n t " android:layout_height="w r a p _ c o n te n t" android:backgrounds" @ a n d r o id :d r a w a b le /e d itb o x _ b a c k g r o u n d " android:layout_below=" @ id /la b e l" android:editables "true"><:/edittext> <Button android:ids" +id/ok" android:layout_widths"w r a p _ c o n te n t" android:layout_heights"w r a p _ c o n te n t" android:layout_belows" @ id /e n try" android:layout_alignparentrights"tru e" android:layout_marginlefts"lopx" android: texts "OJC">c/Button> <Button android:ids" @ + id /c a n c e l" android:layout_widths" w ra p _ c o n te n t" android:layout_height=" w ra p _ c o n te n t" android:layout_aligntop= @ id/ok" android:texts" C ancel" ></Button> </RelativeLayout> Όταν γίνει αυτό τότε ττηγαίνουμε στο φάκελο src και πατάμε στο package δεξί κουμπί για να επιλέξουμε το New Class και εκεί γράφουμε το όνομα StreetView. Στην συνέχεια γράφουμε τον κώδικα όπως αυτός περιγράφεται στο πλαίσιο 11. Η κλάση αυτή ελέγχει την ροή έτσι ώστε όταν πατηθεί το κουμπί Cancel να επιστρέφει ξανά στο αρχικό GoogleMapsApplication χωρίς καμία αλλαγή, ενώ το Ok να επιστρέφει στην GoogleMapsApplication με το όνομα της οδού, που έδωσε ο χρήστης. Η μέθοδος που θα ανταποκρίνεται στα παραπάνω θα είναι η onactivityresult, κώδικας της οποίας περιγράφεται στο πλαίσιο 12.
1.google.dimploma.GoogleMapsApplication; import android.app.activity; import android.content.intent; import android.os.bundle; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.edittext; public class StreetView extends Activity{ EditText strtext; / / B e sure to call the super class, super.oncreate(savedinstancestate); setcontentview(r.layout.s e a r c h ); // Watch for button clicks. Button button = (Button)findViewByld(R.id.ok); button.setonclic)ilistener (okclick) ; button = (Button)findViewById(R.id.cancel); button. setoncliclclistener (cancelclick) ; StrText = (EditText)findViewByld(R.id.entry); } //Press Cancel Button private OnClic)cListener cancelclick = new OnClic)cListener () { public void onclick(view argo) { setresult{result_canceled, (new Intent()).setAction("NO ACTION")); finisho ; //Press Ok Button private OnClickListener okclick OnClic)cListener() { public void onclick(view argo) { setresult(r SULT_OK, (new Intent()).setAction(strText.getText().toString())) finish(); }
Με την ολοκλήρωση του κώδικα θα εμφανίζονται στον χρήστη οι παρακάτω εικόνες. Στην Εικόνα 12 θα εμφανίζεται το κουμπί με το οποίο θα ενεργοποιείται το παράθυρο StreetView και στην εικόνα 13 το παράθυρό του StreetView και στην εικόνα 14 φαίνεται η ετηστροφή της επιλογής του χρήστη ανάλογα με την επιλογή που έκανε. Επίσης πρέπει να προσθέσουμε στο GoogleMapsApplication Manifest την γραμμή της κλάσης StreetView(IRaicno 13).
Έχοντας τώρα το όνομα της οδού στην οποία θέλουμε να μας οδηγήσει το λογισμικό πρέπει να «ρωτήσουμε» την διαδρομή από το Google και μετά να την αναπαραστήσουμε στο λογισμικό μας. Η διαδικασία αυτή απαιτεί έναν Geocoder[], ο οποίος με είσοδο την οδό θα επιστρέψει λίστα διευθύνσεων για τον σχεδιασμό του μονοπατιού. Ο κώδικας αυτό θα τοποθετηθεί στο σημείο της onactivityresult στο οΐ5ε(πλαίσιο 14).
Μετά την φόρτωση της λίστας διευθύνσεων το πρόγραμμα δίνει τιμή στο σημείο destination και ξεκινά ο σχεδιασμός της διαδρομής από το σημείο ρ (σημείο στο οποίο βρισκόμαστε) προς το destination. Η μέθοδος DrawPath περιγράφεται στο Πλαίσιο 15 & 16.
doc.geteleft jetfirstchildo.getfirstchildo.getnodev d\immy2 =doc.getelementsbytagname("placemark") getpirstchildo.getnextsiblingo.getfir stchildo.getnodevalue (); dunutty2» dununy2.replaceall ("go ", " d\immy2 * dummy2.replaceall (" & #160" dummy2 * dummy2.trim(>; String. vaiueof(i+l) ; f (i ",dummy +" "+ duirany2}; structions = "1."+dumrny+" "+dummy2+'\n'; itructions += String. valueojf (i+1)+diiinmy+" Toast.makeText(getBaseContex TH_LONG). show(}; ) tch (MalformedURLException e) e.printstacktrace(); tch (loexception e) tch (ParserConfigurationException Πλαίσιο 16 H συνάρτηση DrawPath παίρνει τα GeoPoints p και destination και κάνει ερώτηση στην Google για την διαδρομή, σχηματίζοντας μία ερώτηση τύπου URL. Σαν απάντηση η Google του επιστρέφει ένα αρχείο xml, που είναι δομημένο όπως μία διαδρομή στο Google Earth. Η DrawPath μετά παίρνει το αρχείο και το σπάει στα ενδιάμεσα κομμάηα του με σκοπό να σχεδιαστεί το μονοπάτι πάνω στον χάρτη. Αυτό όμως πάλι (σχεδιασμός πάνω στον χάρτη) μπορεί να γίνει μόνο με ένα OverLay. Στην προκειμένη περίπτωση θα είναι μία κλάση MyOverlay, η οποία θυμίζει λίγο μία διαφάνεια που τοποθετείται πάνω από τον χάρτη μας. Κάθε ευθύγραμμο τμήμα σχεδιάζεται σε ένα MyOverlay, τα οποία προστίθενται μαζί κι έτσι σχηματίζεται γραφικά η διαδρομή. Στο Πλαίσιο 15 φαίνεται η πρόσθεση των MyOverlay. Ο κώδικας της κλάσης MyOverlay περιγράφεται στο Πλαίσιο 17 παρακάτω.
Στην κλάση MyOverlay διαχωρίζουμ 3 7τεριπτώσεις(ιπο(1ε) σχεδιασμού. Η πρώτη περίπτωση συσχετίζεται με την έναρξη, όπου θα μαρκαριστεί έντονα το σημείο έναρξης και θα τοποθετηθεί στο σημείο αυτό η εικόνα μιας σημαίας. Η δεύτερη περίπτωση είναι η σύνδεση ενός επιπλέον ενδιάμεσου κόμβου. Τέλος η τρίτη περίπτωση είναι το σημείο τερματισμού με την αντίστοιχη σημαία του. Οι εικόνες αυτές αναπτύχθηκαν σε μορφή gif και αποθηκεύτηκαν στο φάκελο res->drawable. Τα ονόματα των εικόνων είναι αντίστοιχα start.gif και finale.gif Μετά λοιπόν την είσοδο της οδού αριθμού και πόλης. Το StreetView επιστρέφει στο GoogleMapsApplication το κείμενο. Εκεί δομείται το κείμενο σε μορφή που αποδέχεται ο GeoCoder με τον οποίο από τη διεύθυνση θα πάρουμε τις συντεταγμένες μας(1αίίίυάε, longtitude). Στην συνέχεια καλείται η DrawPath που έχει στόχο την σχεδίαση του μονοπατιού. Σχηματίζει λοιπόν ερώτηση στο Google για την διαδρομή. Η αντίστοιχη απάντηση που επιστρέφει το Google είναι σε μορφή kml που χρησιμοποιείται και από το Google Earth. Είναι δομημένο xml αρχείο, από το οποίο αντλούμε τις συντεταγμένες του μονοπατιού. Τα ζευγάρια μονοπατιών χρησιμοποιούνται για να σχεδιαστεί το μονοπάτι με το MyOverlay[9](Εικόνα 15). Μέσα στο αρχείο kml υπάρχουν επίσης και οδηγίες που προβάλλονται στον χρήστη. 5 6 7 8 9 0 Q W A S Ζ Τ Υ υ I Ο Ρ
Γνα να αναιρέσουμε την τιερίπτωση στην οποία γνωρίζουμε για το πού βρίσκεται στον χάρτη ο προορισμός μας, αλλά χωρίς την ακριβή διεύθυνση, θα προσθέσουμε την ιδιότητα να μπορούμε ακουμπώντας σττ ν οθόνη να προβάλλεται η ακριβή διεύθυνση της επιλογής μας. Θα γράψουμε στο GoogleMapsApplication μία συνάρτηση με όνομα ontouchevent (Πλαίσιο 18), που βρίσκεται μέσα σε μία κλάση MapOverlay. Αυτή λειτουργεί όπως ακριβώς και το MyOverlay μόνο που σχεδιάζει επάνω μόνο επυιλέον την σημαία στην οποία βρίσκεται ο χρήστης.
Μία ετηπλέον λειτουργία που προστέθηκε στην κλάση ΜαρΟνετΐ3γ(Πλαίσνο 19) είναι η προβολή των οδηγιών ξανά στον χρήστη. Με το πατηθεί το τρακ μπαλάκη ή πατηθεί ένα σημείο του χάρτη, τότε προβάλλονται ξανά οι οδηγίες(εικόνα 16). Override public boolean ontap(geopoint p, MapView mapview){ if(instructions!= null){ Toast.maJceText(getBaseContext(), instructions. Toast.LENGTH_IjONG). show () ; } 1 falsi Q W E R T U I 0 P A S D F G H J K L Σαν τελευταία πράξη απομένει η ανηστοίχιση ενός εικονιδίου στην εφαρμογή. Ήδη η Eclipse και το Android SDK από μόνα τους παράγουν στον φάκελο res/drawable ένα εικονίδιο με όνομα icon.png. Οι διαστάσεις πρέπει να είναι 48x48 με βάθος χρώματος 32bit και ανάλυση 96x96. Το εικονίδιο ορίζεται στην συνέχεια στο Manifest αρχείο της εφαρμογής(εικόνα 17).
Παρακάτω ακολουθούν τα αντίστοιχα διαγράμματα της εφαρμογής σε UML. Στην εικόνα 18 αναπαρίστανται όλες οι κλάσεις που χρησιμοποιούνται στην εφαρμογή. Στο διάγραμμα της εικόνας 19 φαίνεται η επικοινωνία των κλάσεων μεταξύ τους. Στο διάγραμμα της εικόνας 20 οι ενέργειες του χρήστη και το GPS. Τέλος στην εικόνα 21 φαίνεται το διάγραμμα ροής δεδομένων της εφαρμογής, ξεκινώντας με το διάλογο του Google με την εφαρμογή.
Εγκατάσταση Eclipse και Android SDK Για την ανάπτυξη της εφαρμογής Android πρέπει να εγκατασταθεί το προγραμματιστικό περιβάλλον της Eclipse[10] και επίσης η SDK βιβλιοθήκη της Android. Κατεβάζουμε από την ιστοσελίδα το Eclipse και το εκτελούμε. Όταν ολοκληρωθεί η εγκατάσταση πηγαίνουμε στο Help -> Software Updates(EiK0va 22). Πατάμε το κουμπί Add Site και γράφουμε την διεύθυνση https://dlssl.google.com/androidyeclipse/. Όταν φορτώσει λογισμικό από την σελίδα αυτή επιλέγουμε όλο το λογισμικό πακέτο(εικόνα 23) και πατάμε install. 3 http://download.eclipse.org/tools/cdt/releasesyganymede a ^ http;/ydownload.eclipse.org/tools/mylyn/update/e3.3 3 0 θ https://dl-ssl.google.com/android/eclipse/ a 0800 Developer Tools a ^ M2M Update Site B 0 < a M2T Update Site To λογισμικό εγκαθίσταται και επανεκκινεί το eclipse.
Στην συνέχεια πηγαίνουμε στην ιστοσελίδα developer.android.com/sdk/index.html όπου και κατεβάζουμε πρώτα το αντίστοιχο android-sdk[l 1]. Αποσυμπιέστε το αρχείο σε ένα καλά οργανωμένο σημείο του σκληρού δίσκου. Στη συνέχεια πηγαίνετε στον Υπολογιστή μου και ετηλέξτε ιδιότητες και ττηγαίνετε στο tab για προχωρημένους(εικόνα 24). Εκεί επιλέξτε Μεταβλητές περιβάλλοντος και προσθέστε στο Path την τοποθεσία του SDK/tooIs. Επαναφορά Συστήματος ρνημερώσείς Απομακρυςηχένη Αυτόματος oiivsean Γενικά I Όνομα υποϋογιατή YfkKO Για προχωρημένους Πρέπει να έχετε συνδεθεί ως Administrator για την πραγματοποίηση των περισσότερων από αυτές τις αϋϋαγές. Επιδόσεις Οπτικά εφέ, χρονοδιάγραμμα επεξεργαστή, χριτση μνήμης και εικονική μνημη I Ρυθμίσεις ΠροφίϊΙ χρηστών Ρυθμίσεις επιφάνειας εργασίας σχετικές με τη σύνδεσή σας I Ρυθμίσεις Εκκίνηση και αποκατάσταση I Ρυθμίσεις I Μεταβίίητές περιβάϋϋοντος [ Αναφορά σφά3ματος ] I Άκυρο ] Εφαρμογή Εικόνα 24 Στο τελευταίο βήμα πηγαίνετε πίσω στην Eclipse και στο Windows -> Preferences. Εκεί επιλέξτε Android και τοποθετήστε το μονοπάτι του android-sdk μέσα (Εικόνα 25). Πατήστε Apply και Ok. Για να εκτελέσετε στη συνέχεια τον προσομοιωτή θα πρέπει πρώτα από το Window- >Android SDK και AVD Manager να δημιουργήσετε μία virtual device. Από το παράθυρο αυτό μπορεί ο χρήστης να κατεβάσει λογισμικά πακέτα και να εκσυγχρονίζει τις εφαρμογές του(εικόνα 26). Η εγκατάσταση ολοκληρώθηκε!!!
Εγκατάσταση της εφαρμογής σε συσκευή Σε περίπτω<τη που θέλουμε να εγκαταστήσουμε την εφαρμογή μας σε κινητό τηλέφωνο της android συνδέουμε μόνο το τηλέφωνό μας στον υπολογιστή. Τρέχουμε τα αντίστοιχα driver[12] και το eclipse από μόνο του αναγνωρίζει την εφαρμογή. Στο eclipse ο χρήστης επιλέγει στο Project tree Run A s...-> Android Application και αφού είναι συνδεδεμένη η συσκευή μας, τότε εμφανίζεται ένα παράθυρο απ όπου και ετπλέγουμε αν εκτελεστεί η εφαρμογή μας στον emulator ή στο κινητό μας(εικόνα 27). Select a device compatible with target Google APIs (Google Inc.). Choose a running Android device Serial Number y HT97TL901844 O Launch a new Android Virtual Device Όταν ετηλέξουμε την πραγματική συσκευή τότε στο κινητό μας θα εγκατασταθεί η εφαρμογή και επίσης θα εκτελεστεί.
Βιβλιογραφία [1] http://developer.android.com/guide/tutorials/hello-world.html [2] http://developer.android.com/guide/topics/manifest/manifest-intro.html [3] http://developer.android.com/reference/android/manifest.permission.html [4] http://developer.android.com/guide/topics/ui/declaring-lavout.html [5] http://code.google.com/android/add-ons/google-apis/mapkev.html [6] http://csie-tw.blogspot.eom/2009/05/enable-android-log-androidlog.html [7] http://code.google.com/android/add-ons/goqgleapis/reference/index.html?com/google/android/maps/package-summ arv.html [8] http://developer.android.com/reference/android/view/package-summarv.html [9] http://code.google.com/android/add-ons/googleapis/reference/com/goqgle/android/maps/overlav.html [10] http://www.eclipse.org [11] http://developer.android.com/sdk/index.html [12] http://www.htc.com/support