Όπως
προαναφέραμε οι clients
είναι συσκευές Android
που εκτελούν την εφαρμογή OptiPath.
To
OptiPath
εκτελεί ουσιαστικά δύο λειτουργίες.
- Διεπαφή χρήστη
- Συλλογή και αποστολή δεδομένων στον server
Η κεντρική οθόνη
της εφαρμογής είναι ένα MapView
το
οποίο εμφανίζει στον χρήστη ένα χάρτη, ενώ με τη χρήση του GPS ή/και της σύνδεσης 3G/WiFi γίνεται
προσδιορισμός της θέσης του σε αυτόν, με τη χρήση ενός Overlay. Ο χρήστης μπορεί να
πλοηγηθεί στον χάρτη και να επιλέξει τον προορισμό του με ένα χτύπημα στην
οθόνη. Με την επιβεβαίωση του προορισμού στο Alert Dialog που
εμφανίζεται, εκτελείται ένα AsyncTask
και δημιουργείται ένα ερώτημα στον Server με την διαδικασία που
αναφέρθηκε προηγουμένως. Με τη λήψη της απάντησης από τον Server αποτυπώνεται
η διαδρομή πάνω στον χάρτη (με Overlay)
και μεταβάλλεται το zoom.
Επίσης εμφανίζονται πληροφορίες όπως το μήκος της διαδρομής, και ο χρόνος που
χρειάζεται κατά προσέγγιση ο χρήστης για να τη διανύσει.
Το
Menu
της
εφαρμογής εμφανίζεται πιέζοντας το αντίστοιχο πλήκτρο στη συσκευή. Οι επιλογές
που παρέχονται είναι:
·
New Route
·
Cancel
Route
·
Directions
·
About
·
Exit
Για την επιλογή
προορισμού παρέχεται στο χρήστη η δυνατότητα να αναζητήσει τη διεύθυνση που
επιθυμεί επιλέγοντας New
Route
από
το Menu
της
εφαρμογής. Ο χρήστης μπορεί να αναζητήσει τον προορισμό που επιθυμεί
πληκτρολογώντας στο EditText
που
εμφανίζεται στην οθόνη για αυτό το σκοπό. Κατά την πληκτρολόγηση εμφανίζονται
στο χρήστη αποτελέσματα με τη χρήση του Places Autocomplete Api της Google. Αυτό βοηθάει στην ταχύτερη εύρεση
του προορισμού, αφού με κάθε γράμμα που εισάγεται, εμφανίζονται διευθύνσεις που
έχουν μεγάλη πιθανότητα να ταυτίζονται με την επιλογή του χρήστη.
Επιπρόσθετα
στην παραπάνω λειτουργία, παρέχεται η δυνατότητα αναζήτησης πλήρους διεύθυνσης
με τη χρήση του Places
Api
της
Google.
Για την λήψη αποτελεσμάτων, χρησιμοποιώντας αυτή την υλοποίηση, ο χρήστης, αφού
πληκτρολογήσει την πλήρη διεύθυνση, πρέπει να πατήσει το Search Button που
βρίσκεται δίπλα στο EditText.
Και
στις δύο περιπτώσεις, η συλλογή των αποτελεσμάτων και η εμφάνισή τους στον
χρήστη, γίνεται με την χρήση του AsyncTask,
προκειμένου να μην αναστέλλεται η λειτουργία του Thread της
οθόνης.
Με
την επιλογή ενός αποτελέσματος, ακολουθείται η παραπάνω διαδικασία επικοινωνίας
με το Server
και
σχεδιασμού της διαδρομής.
Places Autocomplete Api Places Api
Η
επιλογή Cancel
Route
ακυρώνει
την επιλεγμένη διαδρομή, αφαιρώντας τα Overlays από
τον χάρτη καθώς και τις πληροφορίες μήκους, χρόνου και τις οδηγίες πλοήγησης.
Η επιλογή Directions εμφανίζει
στην οθόνη του χρήστη τις οδηγίες πλοήγησης από το σημείο εκκίνησης μέχρι και
τον προορισμό.
Η
επιλογή About
εμφανίζει
συνοπτικές πληροφορίες σχετικά με το πρόγραμμα.
Η
επιλογή Exit
τερματίζει
την εφαρμογή και σταματάει την λειτουργία συλλογής και αποστολής δεδομένων
κίνησης στον Server
την
οποία αναλύουμε αμέσως μετά.
Η
συλλογή και αποστολή δεδομένων κίνησης στον server υλοποιήθηκε με τη χρήση του service που παρέχεται από το Android SDK. Το service επιλέχθηκε ανάμεσα από
άλλες λύσεις καθώς συνεχίζει να εκτελείται στο παρασκήνιο ακόμη και αν ο
χρήστης χρησιμοποιεί άλλη εφαρμογή. Έτσι, καθώς ο χρήστης κινείται με το
αυτοκίνητό του, συλλέγονται δεδομένα από τον αισθητήρα του GPS και
κάθε φορά που ο χρήστης μετακινείται κατά 10 μέτρα δημιουργείται ένα
token.
Μόλις συγκεντρωθούν 5 tokens
δημιουργείται
ένα AsyncTask
μέσα
από το οποίο, με τη χρήση sockets,
αποστέλλονται τα tokens
στον
server.
Το AsyncTask επιλέχθηκε
γιατί εκτελείται στο παρασκήνιο και δεν προκαλεί πάγωμα στην εφαρμογή.
Κατά
τη διάρκεια της συλλογής δεδομένων κίνησης, εμφανίζεται στο notification bar της
συσκευής το κατάλληλο notification
το
οποίο ενημερώνει τον χρήστη για αυτή την λειτουργία, και το οποίο καθιστά άμεση
την επιστροφή στην εφαρμογή απλά με την επιλογή του.
Καθώς ο χρήστης κινείται, μπορεί για
οποιοδήποτε λόγο να παρεκκλίνει από την
διαδρομή που του έχει επιστραφεί σαν βέλτιστη. Για τον λόγο αυτό η εφαρμογή
ελέγχει αν η τρέχουσα θέση του βρίσκεται μέσα στην διαδρομή που έχει επιστραφεί
από την Google.
Συγκεκριμένα για κάθε Token της διαδρομής καλείται η μέθοδος isPartOfLine(PointT p,
double div). Αν η τρέχουσα θέση του χρήστη δεν ανήκει σε κανένα από αυτά τα tokens τότε ο μετρητής errorCounter αυξάνεται κατά ένα. Στην
περίπτωση που ο χρήστης επανέλθει στην διαδρομή, ο μετρητής τίθεται ίσος με το
μηδέν. Στην περίπτωση που ο μετρητής είναι ίσος με πέντε, τότε συνεπάγεται ότι
ο χρήστης βρίσκεται οριστικά εκτός διαδρομής και δημιουργείται νέο ερώτημα προς
τον Server με
σημείο εκκίνησης της διαδρομής την τρέχουσα θέση του χρήστη και σημείο
προορισμού την επιλογή που είχε κάνει προηγουμένως.
Κατά την υλοποίηση, αντιμετωπίστηκαν θέματα όπως το πρόβλημα
που προκύπτει όταν γίνεται rotate η συσκευή, ενώ έχει γίνει χρήση και του WakeLock προκειμένου η συσκευή να μην
τίθεται σε κατάσταση αναμονής όσο βρίσκεται η εφαρμογή στο προσκήνιο.





Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου