He creado una pequeña aplicación con una descripción paso a paso para obtener las coordenadas GPS de la ubicación actual.
El código fuente completo del ejemplo se encuentra en Obtener coordenadas de ubicación actual, Nombre de ciudad - en Android .
Mira cómo funciona:
Todo lo que necesitamos hacer es agregar este permiso en el archivo de manifiesto:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Y cree una instancia de LocationManager como esta:
LocationManager locationManager = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
Compruebe si el GPS está habilitado o no.
Y luego implemente LocationListener y obtenga coordenadas:
LocationListener locationListener = new MyLocationListener();
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 5000, 10, locationListener);
Aquí está el código de muestra para hacerlo
/*---------- Listener class to get coordinates ------------- */
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location loc) {
editLocation.setText("");
pb.setVisibility(View.INVISIBLE);
Toast.makeText(
getBaseContext(),
"Location changed: Lat: " + loc.getLatitude() + " Lng: "
+ loc.getLongitude(), Toast.LENGTH_SHORT).show();
String longitude = "Longitude: " + loc.getLongitude();
Log.v(TAG, longitude);
String latitude = "Latitude: " + loc.getLatitude();
Log.v(TAG, latitude);
/*------- To get city name from coordinates -------- */
String cityName = null;
Geocoder gcd = new Geocoder(getBaseContext(), Locale.getDefault());
List<Address> addresses;
try {
addresses = gcd.getFromLocation(loc.getLatitude(),
loc.getLongitude(), 1);
if (addresses.size() > 0) {
System.out.println(addresses.get(0).getLocality());
cityName = addresses.get(0).getLocality();
}
}
catch (IOException e) {
e.printStackTrace();
}
String s = longitude + "\n" + latitude + "\n\nMy Current City is: "
+ cityName;
editLocation.setText(s);
}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
}
adresses
la línea que comienzacityName =
, fallará con una excepción. El uso de llaves lo arreglaría.getLastKnownLocation()
es una ubicación más "obsoleta", ¿por qué es esto? ¿Las llamadasgetLastKnownLocation()
no obtienen la última lectura de GPS del GPS del teléfono?Aquí hay información adicional para otras respuestas.
Como Android tiene
puede registrarse en ambos y comenzar a buscar eventos
onLocationChanged(Location location)
de dos al mismo tiempo. Hasta aquí todo bien. Ahora la pregunta, ¿necesitamos dos resultados o deberíamos tomar lo mejor? Como sé, losGPS_PROVIDER
resultados tienen mejor precisión queNETWORK_PROVIDER
.Definamos el
Location
campo:Antes de comenzar a escuchar el cambio de ubicación , implementaremos el siguiente método. Este método devuelve la última ubicación conocida, entre el GPS y la red. Para este método más nuevo es el mejor.
Cada vez que recuperamos una nueva ubicación, la compararemos con nuestro resultado anterior.
Añado un nuevo método para
onLocationChanged
:fuente
private Location currentBestLocation = null;
y agregue `makeUseOfNewLocation (location);` al método onLocationChanged (..)Puede encontrar la ubicación ya sea por
GPS_PROVIDER or NETWORK_PROVIDER
.Descripción general de los servicios de ubicación en Android.
Aquí hay un ejemplo que intenta encontrar la ubicación usando el GPS. Si su GPS no está disponible, intente usar la red para encontrar la ubicación.
GPSTracker.java
Actividad -AndroidGPSTrackingActivity.java
Layout- main.xml
AndroidManifest.xml
fuente
Ya hay muchas respuestas allí, pero quiero mostrar la última forma de obtener la ubicación utilizando la API de Google, para que los nuevos programadores puedan usar un nuevo método:
He escrito un tutorial detallado sobre la ubicación actual en Android en mi blog demonuts.com También puedes encontrar el código fuente completo desarrollado con Android Studio.
En primer lugar, pon esto en el archivo gradle
luego implemente las interfaces necesarias
declarar instancias
poner esto en
onCreate()
Por fin, anule los métodos necesarios
No olvide iniciar el GPS en su dispositivo antes de ejecutar la aplicación.
fuente
mLocation
siempre da nulo. Intenté lo mismo que se mencionócompile 'com.google.android.gms:play-services-location:11.0.4'
lugar de agregar todos los servicios de Google Play a su aplicación.Como no me gustó parte del código en las otras respuestas, aquí está mi solución simple. Esta solución está destinada a ser utilizable en una Actividad o Servicio para rastrear la ubicación. Se asegura de que nunca devuelva datos demasiado obsoletos a menos que solicite explícitamente datos obsoletos. Se puede ejecutar en modo de devolución de llamada para obtener actualizaciones a medida que las recibimos, o en modo de encuesta para buscar la información más reciente.
Interfaz genérica de LocationTracker. Nos permite tener múltiples tipos de rastreadores de ubicación y enchufar fácilmente el apropiado:
ProviderLocationTracker: esta clase rastreará la ubicación para GPS o RED.
El es el FallbackLocationTracker, que rastreará tanto por GPS como por RED, y usará cualquier ubicación que sea más precisa.
Dado que ambos implementan la interfaz LocationTracker, puede cambiar fácilmente de opinión acerca de cuál usar. Para ejecutar la clase en modo encuesta, solo llame a start (). Para ejecutarlo en modo de actualización, llame a start (Listener).
También eche un vistazo a mi blog en el código
fuente
FallbackLocationTracker fallbackLocationTracker = new FallbackLocationTracker(mContext); fallbackLocationTracker.start(); if (fallbackLocationTracker.hasLocation()) { return fallbackLocationTracker.getLocation(); }
Obtener ubicación de gps por -
fuente
location.getSpeed()
devuelve la velocidad en metros / seg (no metros / min).Necesitas usar lo último / más nuevo
Básicamente lo que necesitas hacer es:
Entonces
para la ubicación más precisa y confiable. Mira mi publicación aquí:
https://stackoverflow.com/a/33599228/2644905
No utilice LocationListener, que no es preciso y tiene una respuesta retrasada. Para ser honesto, esto es más fácil de implementar. Lea también la documentación: https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient
fuente
Espero que esto ayude...
fuente
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Ahora que los servicios de ubicaciones de Google Play están aquí, recomiendo que los desarrolladores comiencen a usar el nuevo proveedor de ubicaciones fusionadas. Le resultará más fácil de usar y más preciso. Mire el video de Google I / O Más allá del punto azul: nuevas características en la ubicación de Android de los dos tipos que crearon la nueva API de servicios de ubicación de Google Play
He estado trabajando con las API de ubicación en varias plataformas móviles, y creo que lo que han hecho estos dos tipos es realmente revolucionario. Se ha librado de una gran cantidad de las complejidades del uso de los distintos proveedores. Stack Overflow está plagado de preguntas sobre qué proveedor usar, si usar la última ubicación conocida, cómo establecer otras propiedades en el LocationManager, etc. Esta nueva API que han construido elimina la mayoría de esas incertidumbres y hace que los servicios de ubicación sean un placer. utilizar.
He escrito una aplicación de Android que periódicamente obtiene la ubicación utilizando los servicios de ubicación de Google Play y la envía a un servidor web donde se almacena en una base de datos y se puede ver en Google Maps . He escrito tanto el software del cliente (para Android, iOS, Windows Phone y Java ME ) como el software del servidor (para ASP.NET y SQL Server o PHP y MySQL ). El software está escrito en el idioma nativo en cada plataforma y funciona correctamente en segundo plano en cada una. Por último, el software tiene la licencia MIT . Puede encontrar el cliente de Android aquí:
https://github.com/nickfox/GpsTracker/tree/master/phoneClients/android
fuente
Más simple que puedas encontrar
fuente
LocationManager es una clase que proporciona métodos integrados para obtener la última ubicación conocida
LocationManager locationManager = (LocationManager) context.getSystemService (Context.LOCATION_SERVICE);
Hay dos tipos de proveedores de GPS y red.
Si el objeto es nulo ubicación luego tratar Dont al llamado método de abajo s
getLatitude and getLongitude is methods which returns double values
fuente
Obtener actualizaciones de ubicación requiere un montón de código bolierplate en Android, debe cuidar
Para facilitar todos estos pasos, he creado Android-EasyLocation (pequeña biblioteca de Android) que se encargará de todo esto y puede centrarse en la lógica empresarial.
Todo lo que necesita es extender EasyLocationActivity y esto
o
Consulte la aplicación de muestra y los pasos necesarios aquí en https://github.com/akhgupta/Android-EasyLocation
fuente
Hice un proyecto desde el cual podemos obtener la ubicación precisa utilizando los servicios de Google Play, GPS y proveedores de red. Este proyecto se puede encontrar aquí .
La estrategia para encontrar la mejor ubicación es obtener primero la ubicación de los servicios de Google Play si se encuentra la ubicación, luego verifique si el clima es mejor o no, si la ubicación se encuentra nula, reinicie los servicios de Google Play e intente obtener la ubicación desde la API de ubicación de Android. Registre la ubicación en los oyentes de cambios y, cuando se encuentre la mejor ubicación, la devolución de llamada la devuelve a la actividad principal.
Es muy simple de usar e implementar en código solo dos clases que necesitamos incrustar , es decir ,
LocationManagerInterface
y está implementando la interfaz y usando SmartLocationManager para obtener la ubicación.SmartLocationManager
LocationActivity
aquí está la clase de administrador de ubicación
podemos usarlo con actividad o un fragmento, aquí lo estoy usando con actividad
Espero que ayude, si puede sugerir alguna mejora, publíquela en git . Gracias.
fuente
GoogleSamples tiene un ejemplo detallado con el último FusedLocationProviderApi. Lamentablemente, las respuestas más votadas están desactualizadas.
Siga los ejemplos a continuación para implementar Servicios de ubicación utilizando FusedLocationProviderApi
https://github.com/googlesamples/android-play-location/tree/master/LocationUpdates
https://github.com/googlesamples/android-play-location/blob/master/LocationUpdates/app/src/main/java/com/google/android/gms/location/sample/locationupdates/MainActivity.java
fuente
Si está creando nuevos proyectos de ubicación para Android, debe usar el nuevo Google Play servicios de ubicación de . Es mucho más preciso y mucho más sencillo de usar.
He estado trabajando en un proyecto de rastreador GPS de código abierto , GpsTracker, durante varios años. Recientemente lo actualicé para manejar actualizaciones periódicas de teléfonos celulares Android, iOS, Windows Phone y Java ME . Es completamente funcional y hace lo que necesita y tiene la licencia MIT .
El proyecto de Android dentro de GpsTracker utiliza los nuevos servicios de Google Play y también hay dos pilas de servidores ( ASP.NET y PHP ) para permitirle rastrear esos teléfonos.
fuente
Solo para verificar la ubicación puede usar el siguiente código. Puede ponerlo en su onStart () de la actividad principal y mostrar el diálogo de alerta si el retorno es falso.
fuente
Tengo una ubicación muy precisa usando FusedLocationProviderClient
(se requieren servicios de Google Play )
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
'com.google.android.gms: play-services-location: 15.0.0'
fuente
La mejor manera de buscar la ubicación está debajo
fuente
He publicado una pequeña biblioteca que puede facilitar la obtención de datos de ubicación en Android, incluso se encarga de los permisos de tiempo de ejecución de Android M.
Puede verificarlo aquí: https://github.com/julioromano/RxLocation y usarlo o su código fuente como ejemplos para su implementación.
fuente
Búsqueda simple de código de escritura en el método de ubicación
fuente
Recomendaré usar Smart Location Library
Muy simple de usar y envuelve muy bien la lógica de ubicación.
Para iniciar el servicio de ubicación:
Si solo desea obtener una ubicación única (no periódica), puede usar el modificador oneFix. Ejemplo:
fuente
Manera simple y fácil,
Obtenga ubicación usando https://github.com/sachinvarma/EasyLocation .
Paso 1: solo llama
timeInterval -> setInterval (long) (inMilliSeconds) significa: establecer el intervalo en el que desea obtener ubicaciones.
rapidTimeInterval -> setFastestInterval (long) (inMilliSeconds) significa que si una ubicación está disponible antes, puede obtenerla. (es decir, otra aplicación está utilizando los servicios de ubicación).
runAsBackgroundService = True -> (El servicio se ejecutará en segundo plano y se actualiza con frecuencia (de acuerdo con timeInterval y rapidTimeInterval)) runAsBackgroundService = False -> (El servicio se destruirá después de una actualización de ubicación exitosa)
Paso 2: Prepare a los suscriptores de EventBus : declare y anote su método de suscripción, opcionalmente especifique un modo de subproceso:
p.ej:
Eso es todo.
Espero que ayude a alguien en el futuro.
fuente
Abril 2020
Pasos completos para obtener la ubicación actual y evitar la nulabilidad de la última ubicación conocida.
Según la documentación oficial , la última ubicación conocida podría ser nula en caso de:
En este caso, debe solicitar Actualizaciones de ubicación y recibir la nueva ubicación en LocationCallback .
Con los siguientes pasos, su última ubicación conocida nunca será nula.
Requisito previo: biblioteca EasyPermission
Paso 1: en el archivo de manifiesto, agregue este permiso
Paso 2:
Paso 3: Cree las funciones requeridas para ser llamadas en onCreate ()
Paso 4:
Maneje las devoluciones de llamada en onActivityResult () después de asegurarse de que la ubicación esté abierta o que el usuario acepte abrirla.
Paso 5: Obtenga la última ubicación conocida de FusedClientApi
Espero que esto ayude.
Happy Coding 🤓
fuente