Como obtener la ubicación del GPS-Android Studio

Hoy veremos como obtener la ubicación (dirección y coordenadas del gps) en android studio, de forma básica pero muy bien explicado y puedan aplicarlo a sus proyectos.

Primero entenderemos por GPS que es una herramienta incluida en cualquier dispositivo móvil el cual nos permite enviar o recibir todo lo relacionado con nuestra ubicación.
Este ejercicio consiste en un ejercicio simple de mostrar en un TexView la dirección, y en otro TexView la latitud y longitud de nuestro gps si quieres ver ejercicios mas elaborados, al final del post tendrás algunos enlaces que puedes revisar.

 

 

 

 

 

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

——————————————————————————————————————–

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

 

obtener mi ubicación 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
 

activity_main

<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:paddingLeft="16dp"
    android:paddingTop="16dp"
    android:paddingRight="16dp"
    android:paddingBottom="16dp"
    tools:context=".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 Localización, de la siguiente manera (ver comentarios al inicio de cada método que les dejare en proyecto para descarguen)::
 

MainActivity

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í . 

¿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, Aquí.

¿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.

gps desactivado

Actualización: Ahora nos lleva de frente a la configuración del Gps si esta desactivado.
 
 

activando gps

 
 
Para los que usan el emulador Genymotion  hacemos clic en donde dice GPS y lo activamos…..
 

activando gps en genymotion

 
 
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….
 

mi ubicación en google map

 
 
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 acá primero instalar paso a paso google play servicios en Genymotion.

Enlaces de Interés:

Enviar mi ubicación (latitud y longitud) a una base de datos

Mostrar mi ubicación del gps en un fragment

65 comentarios en «Como obtener la ubicación del GPS-Android Studio»

  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.

  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

  3. AndroFast

    Recuerda cambiar esto según, donde lo pruebes.
    1. LocationManager.GPS_PROVIDER permite tomar tu ubicación del gps
    2 .LocationManager.NETWORK_PROVIDER permite tomar tu ubicación de Internet

  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

  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

  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

  7. 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 :'(

  8. 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

  9. 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?

  10. 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? 🙁

  11. 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

  12. 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?

  13. 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.

  14. 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.

  15. AndroFast

    Hola amig@s 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

  16. 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.

  17. 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

  18. 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

  19. 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…

  20. 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

  21. 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.

  22. 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.

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

  24. 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

    1. AndroFast Autor

      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.

  25. 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

    1. AndroFast Autor

      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.

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

  27. Pingback: como enviar la direccion y coordenadas del gps a una base de datos de forma automatica en android studio | ANDROFAST

  28. Pingback: Como obtener la altitud latitud y logintud del gps | ANDROFAST

  29. Pingback: Como extraer la direccion de google map en un texview en android | ANDROFAST

  30. Patricio

    Estimado, el codigo funciona sin problemas en un emulador, pero en el celular con android 8 no toma. El GPS esta activado y aplique el codigo para emularlao en un celular. Me podrías ayudar?

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

WhatsApp chat