Android onLocationChanged location.getTime () devuelve el tiempo incorrecto
Tengo un Samsung Galaxy Tab A. He implementado android.location.LocationListener
y onLocationChanged(Location location)
se llama y me da un poco de longitud y latitud derecha, pero,
El problema es: location.getTime()
me da el tiempo equivocado, devuelve un tiempo cerca de 300000 mil o menos. Debe ser algo así como 1471243684497
.
- SecurityException al llamar a getLastKnownLocation
- NullpointerException al llamar a getSystemService (Context.LOCATION_SERVICE) y onLocationChanged no se llama
- API de Google Places de Google - PlaceAutocompleteFragment
- Android Smart Location Library siempre está conectado a los gps después de la aplicación cerrada
- Prácticas recomendadas para informar de la ubicación del usuario continuamente
No se que hacer.
Clase GPSTracker:
import java.io.IOException; import java.util.List; import java.util.Locale; import android.app.Service; import android.content.Context; import android.content.Intent; import android.location.Address; import android.location.Geocoder; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.util.Log; public class GPSTracker extends Service implements LocationListener { //flag for GPS Status boolean isGPSEnabled = false; //flag for network status //boolean isNetworkEnabled = false; boolean canGetLocation = false; Location location; double latitude; double longitude; //The minimum distance to change updates in metters private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; //10 metters //The minimum time beetwen updates in milliseconds private static final long MIN_TIME_BW_UPDATES = 1000 * 10; // 1 minute //Declaring a Location Manager protected LocationManager locationManager; /*public GPSTracker(Context context) { this.mContext = context; getLocation(); }*/ public Location getLocation(Context ctx) { try { locationManager = (LocationManager) ctx.getSystemService(LOCATION_SERVICE); //getting GPS status isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); //getting network status //isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnabled /*&& !isNetworkEnabled*/) { // no network provider is enabled } else { this.canGetLocation = true; //First get location from Network Provider /* if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("Network", "Network"); if (locationManager != null) { location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); updateGPSCoordinates(); } }*/ //if GPS Enabled get lat/long using GPS Services if (isGPSEnabled) { if (location == null) { locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("GPS Enabled", "GPS Enabled"); if (locationManager != null) { location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); updateGPSCoordinates(); } } } } } catch (Exception e) { //e.printStackTrace(); Log.e("Error : Location", "Impossible to connect to LocationManager", e); } return location; } public void updateGPSCoordinates() { if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } /** * Stop using GPS listener * Calling this function will stop using GPS in your app */ public void stopUsingGPS() { if (locationManager != null) { locationManager.removeUpdates(GPSTracker.this); } } /** * Function to get latitude */ public double getLatitude() { if (location != null) { latitude = location.getLatitude(); } return latitude; } /** * Function to get longitude */ public double getLongitude() { if (location != null) { longitude = location.getLongitude(); } return longitude; } /** * Function to check GPS/wifi enabled */ public boolean canGetLocation() { if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)/*&& !locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)*/){ this.canGetLocation = false; } else { this.canGetLocation = true; } return this.canGetLocation; } /** * Get list of address by latitude and longitude * @return null or List<Address> */ public List<Address> getGeocoderAddress(Context context) { if (location != null) { Geocoder geocoder = new Geocoder(context, Locale.ENGLISH); try { List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1); return addresses; } catch (IOException e) { //e.printStackTrace(); Log.e("Error : Geocoder", "Impossible to connect to Geocoder", e); } } return null; } /** * Try to get AddressLine * @return null or addressLine */ public String getAddressLine(Context context) { List<Address> addresses = getGeocoderAddress(context); if (addresses != null && addresses.size() > 0) { Address address = addresses.get(0); String addressLine = address.getAddressLine(0); return addressLine; } else { return null; } } /** * Try to get Locality * @return null or locality */ public String getLocality(Context context) { List<Address> addresses = getGeocoderAddress(context); if (addresses != null && addresses.size() > 0) { Address address = addresses.get(0); String locality = address.getLocality(); return locality; } else { return null; } } /** * Try to get Postal Code * @return null or postalCode */ public String getPostalCode(Context context) { List<Address> addresses = getGeocoderAddress(context); if (addresses != null && addresses.size() > 0) { Address address = addresses.get(0); String postalCode = address.getPostalCode(); return postalCode; } else { return null; } } /** * Try to get CountryName * @return null or postalCode */ public String getCountryName(Context context) { List<Address> addresses = getGeocoderAddress(context); if (addresses != null && addresses.size() > 0) { Address address = addresses.get(0); String countryName = address.getCountryName(); return countryName; } else { return null; } } @Override public void onLocationChanged(Location location) { } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public IBinder onBind(Intent arg0) { return null; } }
Y mi propia clase que extiende la clase GPSTracker:
public class NewMainService extends GPSTracker { @Override public void onLocationChanged(Location location) { long time = location.getTime(); Log.i("TAG", "onLocationChanged time: "+time); //prints wrong timestamp super.onLocationChanged(location); } }
EDIT :
Todo funciona bien en otros dispositivos.
Lo busqué en Google y es un error en algunos dispositivos. Los oyentes de la localización dejan de recibir cambios después de algún tiempo.
El tiempo que me da es como el tiempo de actividad del dispositivo, son algunas horas, no es una fecha.
- Obtenga la ubicación (coordenadas) periódicamente sin aumentar drásticamente el consumo de la batería
- Error al agregar geofences en Android (código de estado 1000)
- FINE_LOCATION tiene menos precisión que COARSE_LOCATION
- Android getMaxAddressLineIndex devuelve 0 para la línea 1
- ¿Puede DataBinding interferir con la localización de una actividad?
- Centro de aplicaciones de Google Maps V2 Ubicación actual en pantalla
- ¿Es posible obtener una notificación cuando se habilita / deshabilita cualquier proveedor de ubicación y determina qué acción se ha producido?
- ¿Cuál es la mejor manera de esperar a una corrección de ubicación GPS?
Puede utilizar el oyente de localización de NMEA
y obtener sólo el tiempo de eso. Siempre es cierto y se encuentra en la hora UTC, incluso si cambia el huso horario de su dispositivo o la fecha y la hora, esto siempre le dará la fecha y la hora real actual.
Limitaions:
-si el GPS o la ubicación está desactivada, no obtendrá NMEA. (Puede comprobar si la ubicación está activada o no)
-si la ubicación está activada pero el usuario ha cambiado su precisión a la red sólo a través de la configuración, no obtendrá NMEA. (Puede comprobar si
locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
)
- Cómo cambiar el estilo ProgressBar en ListFragment en la biblioteca de compatibilidad?
- Android: MediaPlayer, ¿Cómo obtener las propiedades de un flujo de audio?