Como obtener la Ubicación del GPS-Android

Actualizado:  23/03/2017
-Se arreglo el error Permission
-Cuando el Gps esta desactivado, te lleva automáticamente a la configuración del GPS
-Al caminar la latitud y longitud se actualiza de forma automática

——————————————————————————————————————–
Hace unos días me vino una pregunta a la mente.

Como obtengo la dirección y coordenadas(latitud y longitud) del GPS?

 

Me puse a investigar en algunos sitios e hice un tutorial paso a paso, como siempre comento en mis tutos les voy a dar filete Mignon “nada de hueso” y puedan degustarlo con facilidad.

Empezamos la estructura sera la siguiente:
Primero crearemos un nuevo proyecto al que llamaremos AppGPS
1) Se nos creara un nuevo activity_main.xml
2) Se nos creara nuestro MainActivity.java
3) Nuestro AndroidManifest.xml (tendremos que agregar algunas cosas)

 

Importante:
Una vez creado el proyecto debemos de agregar a nuestra aplicación permisos para usar el GPS dispositivo y para ello nos vamos al fichero AndroidManifest.xml y agregamos el siguiente permiso

<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"/>
Bien nuestro activity_main.xml tendrá lo siguiente 2 Texview y un imageView. Todo dentro de un LinearLayout

También les dejo el activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.androidmorefast.pc.appobtenergps.MainActivity">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentLeft="true"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/mensaje_id"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="TextView" />

            <TextView
                android:id="@+id/mensaje_id2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="TextView" />

            <ImageView
                android:id="@+id/imageView1"
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_gravity="center"
                android:layout_weight="1"
                android:src="@drawable/logo" />
        </LinearLayout>

    </RelativeLayout>



Ahora que hemos configurado la parte gráfica del ejercicio necesitamos, configurara nuestro MainAtivity.java. Vamos a definir un LocationListener.
Un LocationListener, no es mas que una clase que se encarga de estar siempre atenta a cualquier cambio de localidad recibido en el GPS del dispositivo.
Digamos que es como un radar que detecta toda señal de cambio de ubicación que el GPS emite. Para efectos de este tutorial, este LocationListener lo definiremos dentro de nuestra clase MainActivity. Lo primero que debemos hacer es importar el paquete “android.location.LocationListener”, ya que este paquete es el que tiene la definición de la interfaz LocationListener. Luego definimos la clase Localizacion, de la siguiente manera (ver comentarios al inicio de cada método que les dejare en proyecto para descarguen)::

MainActivity.java

public class MainActivity extends AppCompatActivity {
    TextView mensaje1;
    TextView mensaje2;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mensaje1 = (TextView) findViewById(R.id.mensaje_id);
        mensaje2 = (TextView) findViewById(R.id.mensaje_id2);


        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 1000);
        } else {
            locationStart();
        }
    }

    private void locationStart() {
        LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Localizacion Local = new Localizacion();
        Local.setMainActivity(this);
        final boolean gpsEnabled = mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        if (!gpsEnabled) {
            Intent settingsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(settingsIntent);
        }
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 1000);
            return;
        }
        mlocManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, (LocationListener) Local);
        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, (LocationListener) Local);

        mensaje1.setText("Localización agregada");
        mensaje2.setText("");
    }

    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == 1000) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                locationStart();
                return;
            }
        }
    }

    public void setLocation(Location loc) {
        //Obtener la direccion de la calle a partir de la latitud y la longitud
        if (loc.getLatitude() != 0.0 && loc.getLongitude() != 0.0) {
            try {
                Geocoder geocoder = new Geocoder(this, Locale.getDefault());
                List<Address> list = geocoder.getFromLocation(
                        loc.getLatitude(), loc.getLongitude(), 1);
                if (!list.isEmpty()) {
                    Address DirCalle = list.get(0);
                    mensaje2.setText("Mi direccion es: \n"
                            + DirCalle.getAddressLine(0));
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /* Aqui empieza la Clase Localizacion */
    public class Localizacion implements LocationListener {
        MainActivity mainActivity;

        public MainActivity getMainActivity() {
            return mainActivity;
        }

        public void setMainActivity(MainActivity mainActivity) {
            this.mainActivity = mainActivity;
        }

        @Override
        public void onLocationChanged(Location loc) {
            // Este metodo se ejecuta cada vez que el GPS recibe nuevas coordenadas
            // debido a la deteccion de un cambio de ubicacion

            loc.getLatitude();
            loc.getLongitude();

            String Text = "Mi ubicacion actual es: " + "\n Lat = "
                    + loc.getLatitude() + "\n Long = " + loc.getLongitude();
            mensaje1.setText(Text);
            this.mainActivity.setLocation(loc);
        }

        @Override
        public void onProviderDisabled(String provider) {
            // Este metodo se ejecuta cuando el GPS es desactivado
            mensaje1.setText("GPS Desactivado");
        }

        @Override
        public void onProviderEnabled(String provider) {
            // Este metodo se ejecuta cuando el GPS es activado
            mensaje1.setText("GPS Activado");
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            switch (status) {
                case LocationProvider.AVAILABLE:
                    Log.d("debug", "LocationProvider.AVAILABLE");
                    break;
                case LocationProvider.OUT_OF_SERVICE:
                    Log.d("debug", "LocationProvider.OUT_OF_SERVICE");
                    break;
                case LocationProvider.TEMPORARILY_UNAVAILABLE:
                    Log.d("debug", "LocationProvider.TEMPORARILY_UNAVAILABLE");
                    break;
            }
        }
    }
}

Analizamos el código:
Ahora que tenemos creada nuestra clase Localización debemos de implementarla y para ello debemos llamar al servicio LocationManager del sistema Android y agregar un nuevo LocationListener de actualizaciones de ubicación, que en este caso sería una instancia de nuestra clase Localización
.
Para este ejemplo vamos hacer esto en el método onCreate de nuestra clase MainActivity. Recordemos que el método onCreate se ejecuta durante la creación de la actividad y permite inicializar nuestros componentes tanto de UI como de Lógica de negocio.

¿Como Obtengo las Coordenadas?

Dentro del método onLocationChanged  pasamos como parámetro a la clase Location, esta clase en particular nos permitirá utilizar sus dos atributos que son getLatitude y getLongitude  y con ella obtenemos las coordenadas, si quieres profundizar en la clase te dejo el siguiente enlace haciendo clic aquí Location. 

¿Como Obtengo la Dirección?

Esto lo vemos en el método setLocation, si observan un poco se darán cuenta que primero obtenemos las coordenadas tanto latitud con getLatitude getLongitude y luego hacemos uso de la clase  Geocoder. 

 

Geocoder es una clase para manejar geocodificación y geocodificación inversa. La geocodificación es el proceso de transformar una dirección de calle u otra descripción de una ubicación en una coordenada (latitud, longitud). La geocodificación inversa es el proceso de transformar una coordenada (latitud, longitud) en una dirección (parcial)”.

En ese sentido nosotros usaremos la geocodificacion inversa y de las coordenadas obtenidas la transformaremos a nuestra dirección. si quieres profundizar en el tema lee el siguiente enlace, Geocoder.

¿Que son los Permission?

También se les conoce como permisos en tiempos de ejecución, a partir de la Api 23 es necesario estos permisos si quieres usar algunas partes del hardware del movil, si quiere leer algo mas al respeto sigue el siguiente enlace: Políticas de privacidad para android.permission

Conclusiones:

  • Obtener las coordenadas no son ningún reto para un programador con conocimientos intermedios.
  • Se pudo obtener la dirección a partir de las coordenadas geocodificadas de forma inversa.
  • A partir de la Api 23 hay que ingresar permisos sobre el tiempo de ejecución para usar el GPS.

Bueno ha llegado la hora de ejecutar el apk del millón de dolares xD

Para este ejercicio utilizare el emulador Genymotion en otro post ya le explique el porque.
Quedaría algo así cuando el gps este desactivado.
Actualización: Ahora nos lleva de frente a la configuración del Gps si esta desactivado.
Para los que usan el emulador Genymotion  hacemos clic en donde dice GPS y lo activamos…..
Luego hacemos clic en MAP, les explico como es un emulador de android
las coordenadas hay que indicarle manualmente, es por eso que uso genymotion
con un par de clics y se agrega, no es como otros emuladores
que hay que enviarle las coordenadas por consola etc, etc….
Despues de elegir el lugar que queremos, cerramos y volvemos al programa y nos mostrara esto.
IMPORTANTE:  Te invito a mirar el vídeo actualizado donde se explica algunas cosas que no explican acá para no alargar el tutorial


Espero les haya gustado, a continuación les dejo el proyecto para que lo prueben.

Nota: para que funcione correctamente el gps en genymotion debes pasar por aca primero instalar paso a paso google play servicios en Genymotion.

Programo algunas cosas por diversión, me gusta aprender cosas nuevas y estoy pendiente de todo lo que tenga que ver con tecnología. Este blog lo cree para todas las personas que tengan dificultades en la programación, para ser sincero nunca fui bueno y reprobé algunos cursos de programación, pero mis ganas de aprender pudieron más. SI YO PUEDO TU PUEDES ANIMO!

1+

Users who have LIKED this post:

59 pensamientos sobre “Como obtener la Ubicación del GPS-Android

  1. Carlos

    Una pregunta solo me aparece las coordenadas y no sale el nombre de la calle, lo estoy probando en mi celular android, descargue el archivo que dejaste no he cambiado nada, como lo hago funcionar.

    1+

    Users who have LIKED this comment:

    • avatar
  2. AndroFast

    Disculpa la demora, en este ejercicio, no se utiliza
    ninguna key, es sencillo el ejercicio, solo
    toma la dirección de gps, para keys apis y demás
    es cuando, incluyes mapas de
    googleMap dentro de tu aplicación.Si
    tienes mas dudas, escribeme

    0

  3. AndroFast

    Recuerda cambiar esto según, donde lo pruebes.
    1. LocationManager.GPS_PROVIDER permite hacer ver tu gps en un emulador
    2 .LocationManager.NETWORK_PROVIDER permite ver tu gps en tu celular o tablet

    1+

    Users who have LIKED this comment:

    • avatar
  4. Unknown

    Estoy tratando de hacer un Panic Button para enviar mi nombre, localizacion y hacer una llamada a el primer panic contact.

    como le harias para eso. ya que me estoy confundiendo con las clases. por ejemplo para que funcionan las clases:
    public MainActivity getMainActivity() {
    return mainActivity;
    }

    public void setMainActivity(MainActivity mainActivity) {
    this.mainActivity = mainActivity;
    }

    Este codigo lo probe en mi celular. me gustaria saber como enviarlo por un SMS.

    Saludos

    0

  5. AndroFast

    Hola, la clase MainActivity, se crea por defecto al crear una aplicación en Android. envíame un correo con mas detalles de lo que necesitas, mas abajo hay un formulario de contacto

    1+

    Users who have LIKED this comment:

    • avatar
  6. Nando

    Tengo una duda yo ya descargue la version mas reciente del sdk y ayer me funcionaba una app con el AppCompatActivity pero hoy me lo pone en rojo y el import android.support.v7.app. hasta ahi esta en gris y ya el AppCompatActivity esta en rojo tambien, en mi build.gradle mi buildToolsVersion "24.0.0 y el compile 'com.android.support:appcompat-v7:24.0.0' alguien me podria ayudar a resolver este problema

    1+

    Users who have LIKED this comment:

    • avatar
  7. Mariela

    Para las coordenadas tu gps debe estar activo y para tomar la dirección debes tener acceso a internet.

    1+

    Users who have LIKED this comment:

    • avatar
  8. Ivan Mesina

    Hola, en la parte de:
    obtenerUbicacion.requestLocationUpdates(LocationManager.NETWORK_PROVIDER , 0, 0,(LocationListener)local);

    me aparece un error de permisos, hice todo tal cual pero me da el error de CALL REQUIRES PERMISSION. Ocupo tu ayuda man :'(

    0

  9. AndroFast

    Hola Ivan eso es un problema de actualización, recuerda que este es un tutorial un poco antiguo, pero no te preocupes igual corre a pesar del error, aunque no es un error, en Apis nuevas de android necesitas ingresarle un permiso para que el usuario elija si quiere o no mostrar su ubicación, te prometo hacer un tutorial al respecto para explicar mejor este tema

    0

  10. Anónimo

    Hola , tengo un porblema quiero poder ver la ubicacion de un dispositivo y ver mi ubicacion , no se si me entiendes , pero mi dispositivo esta en movimiento y quiero poder ver donde esta en el mapa , me podes ayudar?

    0

  11. Horat

    Hola, me funciona bastante bien esta aplicacion. Pero a la hora de usarla en un celular Moto G3 con android 6.0 no funciona… ni si quiera funciona un boton que implemente que envia coordenadas a una base de datos. Funciona perfectamente en mi celular con android 4.4.

    Alguien me explica? 🙁

    0

  12. Given

    Para los que tienen una version mas reciente de android studio y se cierra la aplicacion una vez que la prueban, intenten ir al menu "Build" seleccionar "edit flavors" y en ese menu busquen "Target SDK version" seleccionen la version API 21: Android 5.0 (Lollipop) pulsen OK y prueben la applicacion

    Si anteriormente ya habian probado la app en el emulador de android, les muestre el mensaje : "Application installation failed" simplemente presionen "OK" para que desinstale la aplicacion y correra sin problemas

    0

  13. Paloma

    Todo funciona bien, pero no me aparece nada en los textview, simplemente detecta si el gps esta activado o desactivado, y que la localización esta agregada, ¿como puedo solucionar este error?

    0

  14. AndroFast

    1. El dispositivo o emulador debe tener acceso a Internet
    2. Si te fijas en el tutorial claramente se explica que se debe cambiar una parte en el código si es emulado en un celular y cambiar otro código si es usado en un emulador.

    0

  15. AndroFast

    Hola Angel este ejercicio funciona con internet, en teoría debería también poder hacerse otro tipo de código que permita descargar los map de una zona x y luego poder consultarle donde se encuentra el dispositivo.

    0

  16. AndroFast

    Hola [email protected] me parece que aquí hay un mal entendido, en este ejercicio en ninguna parte controlamos la actualizacion del movimiento, eso lo hace de forma automatica la Api, en el ejercicio pasado se tenia que abrir y cerrar la aplicacion para que cambie las posiciones, aunque a mi siempre me funciono bien en android 4.0 creo que el problema viene con apis superiores, pero al agregar el onStatusChanged se esta forzando a que haga una comprobacion del estado, quizas deseen leer algo al respecto les dejo el siguiente enlace https://developer.android.com/reference/android/location/LocationListener.html

    0

  17. Anónimo

    sinceramente muchas gracias y claro que corre bien solo que quería desactivarlo para que no gaste muchos datos al estar actualizando el gps una y otra vez tambien aparece como consumo de batería alto. y leere el enlace.

    0

  18. Raymundo Loza

    hola gracias por el tutorial, esperando que me puedas ayudar el como colocar un marcador a posición actual y que se vallan guardando. podrás ayudarme, deja te menciono que apenas voy aprendiendo android
    saludos

    0

  19. FEBA

    hola q tal… hice tal cual como esta en tu tutorial con permisos y todo… pero siempre me sale que el GPS esta desactivado y si tiene encendido el emulador el Gps… hay q hacer algo mas?
    Por fa ayudeme

    0

  20. Anónimo

    Hola, estoy haciendo una app de geolocalizacion en la cual introduzco las coordenadas en el DDMS…. en el eclipse android me salia bien, pero ahora que se actualizo y se introduce desde la virtualizacion me provoca un error, cambio la forma en que debo programarlo? no quiero poner todo el codigo que es largo…

    0

  21. David Pineda

    Amigo descargué y probé tu programa, y no me muestra el nombre de la calle, solo la latitud y longitud.
    He puesto solamente este: mlocManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, (LocationListener) Local);
    como dice en el vídeo pero nada sigue sin mostrarme nada.
    Gracias por la antención

    0

  22. AndroFast

    Hola, David para que te muestre las calles debes cumplir con lo siguiente que tengas acceso a internet en tu dispositivo y que estés en una zona urbanizada, en zonas rurales o por donde no paso el automovil de google no funciona. Solo te enviara las coordenadas.

    0

  23. SoCu

    Muchas gracias por estas tutoriales, quería preguntarte si te puedo enviar un correo para ver si me puedes guiar con un problema que tengo con el gps, o bien crear un tutorial si lo ves que puede interesar a más seguidores.

    0

  24. Pingback: como mostrar la direccion y coordenadas del gps en un fragment en android studio – ANDROFAST

  25. Jose Luis Gutierrez

    Hola, gracias por compatirnos tu conocimiento. Nos es de mucha ayuda.
    Por favor podrias decirme en que puedo estar fallando si la app toma la ubicacion en el emulador pero no en el celular ya una vez instalada la APK

    Saludos

    0

    1. AndroFast Autor del artículo

      Difícil saber si no se revisa los errores de su android monitor, pero es común que no te muestre nada cuando no tienes activo el gps u si has creado una aplicación nueva debes revisar si pusiste bien los permisos.

      0

  26. ivonne

    he usado varios de tus ejemplos y no he tenido problemas, aqui no me muestra la direccion solo las coordenadas, tengo activado el gps en el celular pero nada mas no resuelve la direccion, saludos

    0

    1. AndroFast Autor del artículo

      Huy Ivonne necesito mas información como por ejemplo si tienes acceso a internet, que versión de api que usas y así toda la información posible para tener una idea de lo que esta pasando y si fuera posible mostrar si hay algún error de tu android monitor.

      0

  27. Pingback: como guardar la direccion y coordenadas del gps a una base de datos en android studio - ANDROFAST

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *