Διάβασμα συντεταγμένων στο Android

Η προγραμματιστική χρήση του GPS είναι κάτι που μπορεί να δυσκολέψει τους προγραμματιστές. Στο άρθρο αυτό θα σας δώσουμε έναν εύκολο τρόπο για να διαβάζετε τις συνταγμένες της τοποθεσίας που δίνει το GPS έτσι ώστε να μπορέσετε να τις χρησιμοποιήσετε στις εφαρμογές σας. Ο κώδικας που ακολουθεί είναι μέρος της νέας μας android εφαρμογής LookingForTable.

 

Αρχικά πρέπει να οριστούν να δικαιώματα που έχουν να κάνουν με το GPS. Αυτά είναι τα: ACCESS_FINE_LOCATION και ACCESS_COARSE_LOCATION. Αυτά τα δικαιώματα ορίζονται στο Manifest ως:

 

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

 

πάνω από το application tag.

 

Αυτό που δυσκολεύει συχνά τους προγραμματιστές είναι η χρήση του LocationManager. Παρακάτω ακολουθεί μία συνάρτηση η  οποία θα σας λύσει τα χέρια. Η getGPS() δε δέχεται κάποιο όρισμα, αλλά κάνει όλη τη “βρώμικη δουλειά”, έτσι ώστε να επιστρέφει ένα διάνυσμα δύο κελιών. Στο πρώτο κελί υπάρχει το γεωγραφικό πλάτος (latitude) ενώ στο δεύτερο το γεωγραφικό  μήκος  (lontitude).  Έχοντας αυτές τις δύο τιμές  μπορείτε να ξέρετε ακριβώς τη τοποθεσία του χρήστη. Στο LookingForTable η τοποθεσία χρησιμοποιείται για να βρεθούν τα κοντινά στον χρήστη μαγαζιά, δηλαδή τα μαγαζιά που βρίσκονται σε μια συγκεκριμένη ακτίνα.

private double[] getGPS() {
        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        List<String> providers = lm.getProviders(true);
 
 
        /* Loop over the array backwards, and if you get an accurate location, then break                 out the loop*/
        Location l = null;
 
        for (int i=providers.size()-1; i>=0; i--) {
 
 
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (ActivityCompat.checkSelfPermission(SearchActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(SearchActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    requestPermissions(new String[] {
                            Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.INTERNET
                    }, 10);
                }
            }
            else {
                l = lm.getLastKnownLocation(providers.get(i));
            }
 
 
            if (l != null) break;
        }
 
        double[] gps = new double[2];
        if (l != null) {
            gps[0] = l.getLatitude();
            gps[1] = l.getLongitude();
        }
        return gps;
    }

Για να γίνει χρήση της συνάρτησης, απλά πρέπει να δημιουργηθεί ένας πίνακας στον οποίο θα εκχωρηθεί η έξοδος της συνάρτησης. Έπειτα γίνεται εκχώρηση του γεωγραφικού πλάτους και του μήκους στις δικές μας μεταβλητές.

double[] latlon = new double[2];
                latlon=getGPS();
                lat=latlon[0];
                lon=latlon[1];

Τέλος πρέπει να γίνει έλεγχος για το αν το GPS είναι ενεργοποιημένο από τον χρήστη και στη περίπτωση που δεν είναι να του δίνει τη δυνατότητα να το ενεργοποιήσει άμεσα.

Αυτό μπορεί να γίνει εάν εκμεταλλευτούμε το γεγονός ότι όταν το GPS είναι απενεργοποιημένο η συνάρτηση getGPS() επιστρέφει για γεωγραφικό πλάτος και γεωγραφικό μήκος της τιμή 0. Έτσι απλά ελέγχουμε αν οι τιμές αυτές είναι 0 ανοίγουμε τις ρυθμίσεις του GPS και καλούμε ξανά τη συνάρτηση για να μας δώσει τις σωστές συντεταγμένες.

 

//if gps is not enable
                if (lat == 0.0 && lon==0.0) {
                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivity(intent);
                    latlon = new double[2];
                    latlon=getGPS();
                    lat=latlon[0];
                    lon=latlon[1];
                }
                else {
//...
                }

Και επειδή το σημείο 0,0 βρίσκεται στο πιο άκυρο σημείο του κόσμου δε δημιουργείται πρόβλημα.

screenshot-from-2016-09-26-22-04-27

 

 

Show Your Love

 

 

 

Facebook Profile photo

Studying in Computer Engineering & Informatics Department. Member of the fedora community. Interested in mobile apps and machine learning.

Leave a Reply

Your email address will not be published. Required fields are marked *