Δευτέρα 13 Φεβρουαρίου 2012

Client


Όπως προαναφέραμε οι 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 προκειμένου η συσκευή να μην τίθεται σε κατάσταση αναμονής όσο βρίσκεται η εφαρμογή στο προσκήνιο.

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

Δημοσίευση σχολίου