How to rescue the GPS location in coordinates, from all users of the application?

Asked

Viewed 15,905 times

20

Explanation/Scenario:

I am developing an application that must redeem in real time the location of users of the same, and these users aware of this, will also, access the location of other users, in a map, to meet:

exemplo mapa

This location must be in real time, because all users have access to the map, and use it to find each other.

Question:

How to make my application rescue in real time this location of all users, (in coordinates) so that later I can use these coordinates and show the location on the map of each user?

Observing:

I’m not asking for an entire application, nor for them to do one for me, I just want to know how to redeem the coordinate of each user of the application :) but if you want to respond more fully including the part that shows the user with such coordinate on the map, it would be extremely useful!

  • I will reward the user who answers this question in a complete way, and fully solve my question, in 250 points of reputation.

  • I added an example image that I created now, is it better? what you want more than I post?

  • I haven’t actually reached the Map part yet, because I don’t even know how to get the coordinates yet, (starting from the point of my question, but I’m reading your answer now)

1 answer

20


If what you want is an app ready, click here, otherwise, adapt the code below.

Kickoff:

There are several examples on the web, but I started from a reply from Soen himself:

First of all, this has to be in the application manifest:

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

Example of use of the class below:

LocationResult locationResult = new LocationResult(){
    @Override
    public void gotLocation(Location location){
        //Usar a localizacao aqui!
    }
};
MyLocation myLocation = new MyLocation();
myLocation.getLocation(this, locationResult);

Mylocation class:

import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

public class MyLocation {
    Timer timer1;
    LocationManager lm;
    LocationResult locationResult;
    boolean gps_enabled=false;
    boolean network_enabled=false;

    public boolean getLocation(Context context, LocationResult result)
    {
        //É usado o callback LocationResult para passar as coordenadas para o codigo do usuario.
        locationResult=result;
        if(lm==null)
            lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        //se o provedor de localizacao nao estiver habilitado, teremos uma excecao.
        try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){}
        try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){}

        //Codigo para nao tentar fazer a leitura sem provedor de localizacao disponivel
        if(!gps_enabled && !network_enabled)
            return false;

        if(gps_enabled)
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
        if(network_enabled)
            lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
        timer1=new Timer();
        timer1.schedule(new GetLastLocation(), 20000);
        return true;
    }

    LocationListener locationListenerGps = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();
            locationResult.gotLocation(location);
            lm.removeUpdates(this);
            lm.removeUpdates(locationListenerNetwork);
        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    LocationListener locationListenerNetwork = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();
            locationResult.gotLocation(location);
            lm.removeUpdates(this);
            lm.removeUpdates(locationListenerGps);
        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    class GetLastLocation extends TimerTask {
        @Override
        public void run() {
             lm.removeUpdates(locationListenerGps);
             lm.removeUpdates(locationListenerNetwork);

             Location net_loc=null, gps_loc=null;
             if(gps_enabled)
                 gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
             if(network_enabled)
                 net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

             //se tiver os dois valores, usar o mais atualizado
             if(gps_loc!=null && net_loc!=null){
                 if(gps_loc.getTime()>net_loc.getTime())
                     locationResult.gotLocation(gps_loc);
                 else
                     locationResult.gotLocation(net_loc);
                 return;
             }

             if(gps_loc!=null){
                 locationResult.gotLocation(gps_loc);
                 return;
             }
             if(net_loc!=null){
                 locationResult.gotLocation(net_loc);
                 return;
             }
             locationResult.gotLocation(null);
        }
    }

    public static abstract class LocationResult{
        public abstract void gotLocation(Location location);
    }
}

Note: Na original thread there are several points and interesting modifications, recommend reading.

  • Very good, kid. I got the coordinates right. Only there’s a little problem... how do I automatically rescue all the time? like a thread

  • @Pauloroberto this routine already does this, the example function should be called every time the user changes location. To get only once you would need to change the requestLocationUpdates for requestSingleUpdate.

  • 1

    This version of Sozão is based on the same solution, but it has some interesting changes, see also if it takes advantage something: http://stackoverflow.com/a/9811633

  • Ahh understood @Bacco, very interesting! even better than I thought :P I’ll take a look at the link

  • Right. You happen to know how to update a map "point" using google maps v2’s api?

  • For Android only has until the V2, a gringo answered me everything I needed to know in the SOEN http://stackoverflow.com/a/23227090/2319589 in detail :P but it was worth helping me as kick start your answer ^^

  • Creates a service to keep picking up the coordinates in an interval.

Show 2 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.