miércoles, 22 de junio de 2016

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 de mi posición en android?
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
01
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("Localizacion 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;
            }
        }
    }
}

Ahora que tenemos creada nuestra clase Localizacion 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 Localizacion.

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.

Bueno ha llegado la hora de ejecutar el apk del millon 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.
 ENLACES DE TEMAS PARECIDOS:
Como mostrar mi ubicacion en google map apiv2 android studio
Como extraer la direccion de google map en un texview en android

Como enviar por mensaje de texto mi ubicación y coordenadas del gps

alex cespedes sanchez

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

Necesito tu Ayuda, dale en compartir para crecer como comunidad.

compartir en facebook compartir en google+ compartir en twitter compartir en pinterest compartir en likedin

42 comentarios:

  1. Gracias me ha servido.

    ResponderEliminar
  2. 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.

    ResponderEliminar
    Respuestas
    1. 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

      Eliminar
  3. Usaste una API y la KEY tambien o no ???

    ResponderEliminar
    Respuestas
    1. 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

      Eliminar
  4. 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

    ResponderEliminar
    Respuestas
    1. 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

      Eliminar
    2. Aqui esta lo que necesitas http://android-morefast.blogspot.pe/2016/06/como-enviar-por-mensaje-de-texto-mi.html

      Eliminar
  5. 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

    ResponderEliminar
    Respuestas
    1. Hola Nando ya te respondimos por imbox, para todos los que tengan el mismo error es porque no actualizaron su sdk

      Eliminar
  6. Buenas tardes, he introducido el código tal cual y solo me sale Localización agregada, nada de coordenadas ni dirección, que puede pasar? Un saludo

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

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

    ResponderEliminar
  8. Hice todo tal cual como lo explicaste pero al ejecutar la app esta se detiene en el emuador y se cierra :(

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

    ResponderEliminar
    Respuestas
    1. 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

      Eliminar
  10. perdón la ignorancia pero no me funciona se cierra y no encuentro como solucionarlo

    ResponderEliminar
    Respuestas
    1. sucede que lo diseñe hace mucho tiempo es funcional desde la 3.0 hasta la 5... seria cuestión de que crees un nuevo ejercicio con compatibilidad a la 6.0

      Eliminar
  11. 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? :(

    ResponderEliminar
    Respuestas
    1. sucede que lo diseñe hace mucho tiempo es funcional desde la 3.0 hasta la 5... seria cuestión de que crees un nuevo ejercicio con compatibilidad a la 6.0

      Eliminar
    2. Ya lo habia hecho pero no funciona. lo raro es que ni siquiera funciona el boton de ese activity pero el de un inicio de sesion que cree si funciona :(

      Eliminar
  12. hola , necesito que desde un botón de mi actividad aparezca una dirección .. un restaurante, y se abra desde google maps o waze... sabes como hacerlo
    si tienes informacion sobre esto puedes agregarme al correo andresbonillaalbornoz@hotmail.com .. gracias

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

    ResponderEliminar
  14. Quiero honestamente agradecer tu aporte...llevaba horas intentando realizar esto.

    ResponderEliminar
  15. 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?

    ResponderEliminar
    Respuestas
    1. 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.

      Eliminar
  16. una pregunta amigo soy nuevo en esto tengo una duda sobre obtener las ubicaciones y es si puedo obtener la ubicación sin tener acceso a Internet como puedo hacer para que funcione el gps sin internet

    ResponderEliminar
    Respuestas
    1. 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.

      Eliminar
  17. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
    Respuestas
    1. Esta al final, por favor vea el video actualizado ahí puede resolver cualquier duda

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
    3. 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

      Eliminar
    4. 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.

      Eliminar
    5. @Anonimo, que bueno que todo quedo aclarado,saludos.

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

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

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

    ResponderEliminar
  21. Hola Android Facil.
    Me parece muy interesante tu información.
    Por favor podrias decirme a que correo te puedo enviar mi inquietud ?
    Mi correo es dtmf1970sur@gmail.com
    Gracias.

    ResponderEliminar

 

Copyright @ 2015 Android-facil.

Designed by Draganus | AndroidFacil