Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Por qué getSpeed ​​() siempre devuelve 0 en android

Necesito conseguir la velocidad y la partida de los gps. Sin embargo, el único número que tengo de location.getSpeed() es 0 oa veces no está disponible. mi código:

  String provider = initLocManager(); if (provider == null) return false; LocationListener locListener = new LocationListener() { public void onLocationChanged(Location location) { updateWithNewLocation(location, interval, startId); Log.i(getString(R.string.logging_tag), "speed =" + location.getSpeed()); } public void onProviderDisabled(String provider){ updateWithNewLocation(null, interval, startId); } public void onProviderEnabled(String provider) {} public void onStatusChanged(String provider, int status, Bundle extras) {} }; _locManager.requestLocationUpdates(provider, interval, DEFAULT_GPS_MIN_DISTANCE, locListener); private String initLocManager() { String context = Context.LOCATION_SERVICE; _locManager = (LocationManager) getSystemService(context); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(true); criteria.setSpeedRequired(true); criteria.setCostAllowed(true); //criteria.setPowerRequirement(Criteria.POWER_LOW); String provider = _locManager.getBestProvider(criteria, true); if (provider == null || provider.equals("")) { displayGPSNotEnabledWarning(this); return null; } return provider; } 

Traté de jugar los Criterios pero no tuve éxito. ¿Alguien tiene una idea de cuál es el problema?

  • ¿Alternativa a dex2jar y jd-GUI?
  • ¿Cómo abrir / mostrar documentos (.pdf, .doc) sin aplicación externa?
  • Uso seguro de glMapBufferRange () en Android / Java
  • Styling ActionMode ActionBar en Android 5.0 Lollipop (con AppCompat)
  • La elevación de PopupWindow de Android no muestra sombra
  • ¿Cómo está comprobando Google SHA1 y el nombre del paquete en las llamadas de la API?
  • ¿Diferencia entre ContentObserver y DatasetObserver?
  • Las solicitudes de Ajax fallan después de actualizar a Cordova 5.0 + cordova-android@4.0
  • Ciclo de vida de la clase de aplicaciones Android
  • Cómo pasar html string a webview en android
  • Manera más fácil de usar svg en android?
  • Cambiar el fondo de ProgressDialog
  • 8 Solutions collect form web for “Por qué getSpeed ​​() siempre devuelve 0 en android”

    Location.getSpeed ​​() sólo devuelve lo que se estableció con location.setSpeed ​​(). Este es un valor que puede establecer para un objeto de ubicación.

    Para calcular la velocidad usando el GPS, tendrás que hacer un poco de matemáticas:

     Speed = distance / time 

    Así que usted tendría que hacer:

     (currentGPSPoint - lastGPSPoint) / (time between GPS points) 

    Todos convertidos a ft / seg, o como quieras mostrar la velocidad. Así es como lo hice cuando hice una aplicación runner.

    Más específicamente, tendrá que calcular para distancias absolutas:

     (sqrt((currentGPSPointX - lastGPSPointX)^2) + (currentGPSPointY - lastGPSPointY)^2)) / (time between GPS points) 

    Podría ayudar a hacer una nueva clase de TrackPoint o algo así, lo que mantiene la ubicación del GPS y la hora en que fue tomada dentro.

    No es mi personalizado LocationListener utilizado para obtener velocidad manualmente y por objeto de ubicación si tiene velocidad.

      new LocationListener() { private Location mLastLocation; @Override public void onLocationChanged(Location pCurrentLocation) { //calcul manually speed double speed = 0; if (this.mLastLocation != null) speed = Math.sqrt( Math.pow(pCurrentLocation.getLongitude() - mLastLocation.getLongitude(), 2) + Math.pow(pCurrentLocation.getLatitude() - mLastLocation.getLatitude(), 2) ) / (pCurrentLocation.getTime() - this.mLastLocation.getTime()); //if there is speed from location if (pCurrentLocation.hasSpeed()) //get location speed speed = pCurrentLocation.getSpeed(); this.mLastLocation = pCurrentLocation; //////////// //DO WHAT YOU WANT WITH speed VARIABLE //////////// } @Override public void onStatusChanged(String s, int i, Bundle bundle) { } @Override public void onProviderEnabled(String s) { } @Override public void onProviderDisabled(String s) { } }; 

    En un planeta esférico la distancia debe calcularse con estas fórmulas:

     private static Double distance(Location one, Location two) { int R = 6371000; Double dLat = toRad(two.getLatitude() - one.getLatitude()); Double dLon = toRad(two.getLongitude() - one.getLongitude()); Double lat1 = toRad(one.getLatitude()); Double lat2 = toRad(two.getLatitude()); Double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2); Double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); Double d = R * c; return d; } private static double toRad(Double d) { return d * Math.PI / 180; } 

    Getspeed () funciona bien. Usted no tiene que hacer las matemáticas usando fórmula de distancia. Ya está allí en getspeed, siempre y cuando haya latitud y longitud, habrá una velocidad en getspeed.

    La respuesta de Imbru parece realmente buena, pero no es muy útil si está trabajando con unidades.

    Esto es lo que hice para calcular la velocidad en metros por segundo (m / s).

     new LocationListener() { private Location lastLocation = null; private double calculatedSpeed = 0; @Override public synchronized void onLocationChanged(Location location) { if (lastLocation != null) { double elapsedTime = (location.getTime() - lastLocation.getTime()) / 1_000; // Convert milliseconds to seconds calculatedSpeed = lastLocation.distanceTo(location) / elapsedTime; } this.lastLocation = location; double speed = location.hasSpeed() ? location.getSpeed() : calculatedSpeed; /* There you have it, a speed value in m/s */ . . . } . . . } 

    (1) Creo que puede usar el método requestLocationUpdates() y luego crear una clase LocationListener con un método onLocationChange establecido para mostrar getSpeed() . Esto es cómo lo vi hace poco con Location.getLatitude y Location.getLongitude, así que creo que podría usar getSpeed ​​() de la misma manera, ¿correcto?

    (2) Después de leer la ventana de descripción del eclipse, sin embargo, veo que dice exactamente lo que dijo la persona anterior: "si hasSpeed ​​() es false, se devuelve 0.0f". Pero tal vez esto ayudará: http://www.ehow.com/how_5708473_convert-latitude-feet.html 🙂

    También he encontrado este problema antes, espero que esto puede ayudar.

    Devuelve 0 porque su dispositivo no puede obtener un bloqueo en el GPS o no puede conectarse al GPS.

    Intenté conseguir la velocidad usando un dispositivo más viejo del lenovo y devuelve 0 porque no puede trabar en gps.

    Intenté usar un nexo de la galaxia de Samsung y volvió mi velocidad (tiene un mejor sensor del GPS).

    Es posible que el sensor GPS del teléfono no sea bueno o que se encuentre en un área que tenga una señal de GPS débil como, por ejemplo, dentro de una casa o edificio.

    I basicaslly calcular la velocidad instantánea y luego usar el método setSpeed ​​() para añadirlo en la ubicación. Es bastante preciso porque lo comparé dentro de un vehículo donde podía comprobar el taquímetro.

     private double calculateInstantaneousSpeed(Location location) { double insSpeed = 0; if (y1 == null && x1 <= -1) { //mark the location y1 at time x1 y1 = location; x1 = duration.getDurationAsSeconds(); } else { //mark the location y2 at time x2 y2 = location; x2 = duration.getDurationAsSeconds(); //calculate the slope of the curve (instantaneous speed) dy = y1.distanceTo(y2); dx = x2 - x1; insSpeed = dy / dx; y1 = y2; x1 = x2; } Singleton.getInstance().instantaneousSpeedSamples.add(insSpeed); //System.out.println("Instantaneous Speed m/s: "+insSpeed); return insSpeed; } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.