waze para oficiales conecta apps app aplicaciones android gps location android-location

para - android auto youtube



Determinación de la velocidad de un vehículo con GPS en Android (4)

Me gustaría saber cómo obtener la velocidad de un vehículo usando su teléfono mientras está sentado en el vehículo usando gps. He leído que el acelerómetro no es muy preciso. Otra cosa es; ¿Se podrá acceder al GPS mientras está sentado en un vehículo? ¿No tendrá el mismo efecto que mientras estás en un edificio?

Aquí hay un código que he intentado, pero en su lugar he utilizado el PROVEEDOR DE RED. Apreciaré la ayuda. Gracias...

package com.example.speedtest; import android.app.Activity; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends Activity { LocationManager locManager; LocationListener li; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); locManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE); li=new speed(); locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, li); } class speed implements LocationListener{ @Override public void onLocationChanged(Location loc) { Float thespeed=loc.getSpeed(); Toast.makeText(MainActivity.this,String.valueOf(thespeed), Toast.LENGTH_LONG).show(); } @Override public void onProviderDisabled(String arg0) {} @Override public void onProviderEnabled(String arg0) {} @Override public void onStatusChanged(String arg0, int arg1, Bundle arg2) {} } }


GPS funciona bien en un vehículo. La configuración de NETWORK_PROVIDER puede no ser lo suficientemente precisa para obtener una velocidad confiable, y las ubicaciones de NETWORK_PROVIDER pueden no contener una velocidad. Puede verificar que con location.hasSpeed() ( location.getSpeed() siempre devolverá 0).

Si encuentra que location.getSpeed() no es lo suficientemente preciso, o es inestable (es decir, fluctúa drásticamente), puede calcular la velocidad usted mismo tomando la distancia promedio entre algunas ubicaciones de GPS y dividiendo por el tiempo transcurrido.


Podemos usar location.getSpeed ​​();

try { // Get the location manager double lat; double lon; double speed = 0; LocationManager locationManager = (LocationManager) getActivity().getSystemService(LOCATION_SERVICE); Criteria criteria = new Criteria(); String bestProvider = locationManager.getBestProvider(criteria, false); if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } Location location = locationManager.getLastKnownLocation(bestProvider); try { lat = location.getLatitude(); lon = location.getLongitude(); speed =location.getSpeed(); } catch (NullPointerException e) { lat = -1.0; lon = -1.0; } mTxt_lat.setText("" + lat); mTxt_speed.setText("" + speed); }catch (Exception ex){ ex.printStackTrace(); }


para obtener más información sobre la velocidad de cálculo desde el cambio de ubicación de GPS en el dispositivo móvil Android, vea este enlace

Principalmente hay dos formas de calcular la velocidad desde el teléfono móvil.

  1. Calcular la velocidad desde el acelerómetro
  2. Calcular la velocidad de la tecnología GPS

A diferencia del acelerómetro de la tecnología GPS, si va a calcular la velocidad, debe habilitar la conexión de datos y la conexión GPS.

Aquí vamos a calcular la velocidad utilizando la conexión GPS. En este método, utilizamos la frecuencia con la que los puntos de ubicación del GPS están cambiando durante un período de tiempo único. Entonces, si tenemos la distancia real entre los puntos de ubicación geográfica, podemos obtener la velocidad. Porque tenemos la distancia y el tiempo. Velocidad = distancia / tiempo Pero obtener la distancia entre dos puntos de ubicación no es muy fácil. Debido a que el mundo es un objetivo en forma, la distancia entre dos puntos geográficos es diferente de un lugar a otro y de un ángulo a otro. Así que tenemos que usar el "algoritmo de Haversine"

Primero tenemos que dar permiso para obtener datos de ubicación en el archivo de manifiesto

Hacer la interfaz gráfica de usuario

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/txtCurrentSpeed" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="000.0 miles/hour" android:textAppearance="?android:attr/textAppearanceLarge" /> <CheckBox android:id="@+id/chkMetricUnits" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Use metric units?"/>

Luego haz una interfaz para obtener la velocidad.

package com.isuru.speedometer; import android.location.GpsStatus; import android.location.Location; import android.location.LocationListener; import android.os.Bundle; public interface IBaseGpsListener extends LocationListener, GpsStatus.Listener { public void onLocationChanged(Location location); public void onProviderDisabled(String provider); public void onProviderEnabled(String provider); public void onStatusChanged(String provider, int status, Bundle extras); public void onGpsStatusChanged(int event); }

Implementar la lógica para obtener la velocidad utilizando la ubicación GPS

import android.location.Location; public class CLocation extends Location { private boolean bUseMetricUnits = false; public CLocation(Location location) { this(location, true); } public CLocation(Location location, boolean bUseMetricUnits) { // TODO Auto-generated constructor stub super(location); this.bUseMetricUnits = bUseMetricUnits; } public boolean getUseMetricUnits() { return this.bUseMetricUnits; } public void setUseMetricunits(boolean bUseMetricUntis) { this.bUseMetricUnits = bUseMetricUntis; } @Override public float distanceTo(Location dest) { // TODO Auto-generated method stub float nDistance = super.distanceTo(dest); if(!this.getUseMetricUnits()) { //Convert meters to feet nDistance = nDistance * 3.28083989501312f; } return nDistance; } @Override public float getAccuracy() { // TODO Auto-generated method stub float nAccuracy = super.getAccuracy(); if(!this.getUseMetricUnits()) { //Convert meters to feet nAccuracy = nAccuracy * 3.28083989501312f; } return nAccuracy; } @Override public double getAltitude() { // TODO Auto-generated method stub double nAltitude = super.getAltitude(); if(!this.getUseMetricUnits()) { //Convert meters to feet nAltitude = nAltitude * 3.28083989501312d; } return nAltitude; } @Override public float getSpeed() { // TODO Auto-generated method stub float nSpeed = super.getSpeed() * 3.6f; if(!this.getUseMetricUnits()) { //Convert meters/second to miles/hour nSpeed = nSpeed * 2.2369362920544f/3.6f; } return nSpeed; } }

Combina lógica con GUI

import java.util.Formatter; import java.util.Locale; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.view.Menu; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.TextView; public class MainActivity extends Activity implements IBaseGpsListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); this.updateSpeed(null); CheckBox chkUseMetricUntis = (CheckBox) this.findViewById(R.id.chkMetricUnits); chkUseMetricUntis.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub MainActivity.this.updateSpeed(null); } }); } public void finish() { super.finish(); System.exit(0); } private void updateSpeed(CLocation location) { // TODO Auto-generated method stub float nCurrentSpeed = 0; if(location != null) { location.setUseMetricunits(this.useMetricUnits()); nCurrentSpeed = location.getSpeed(); } Formatter fmt = new Formatter(new StringBuilder()); fmt.format(Locale.US, "%5.1f", nCurrentSpeed); String strCurrentSpeed = fmt.toString(); strCurrentSpeed = strCurrentSpeed.replace('' '', ''0''); String strUnits = "miles/hour"; if(this.useMetricUnits()) { strUnits = "meters/second"; } TextView txtCurrentSpeed = (TextView) this.findViewById(R.id.txtCurrentSpeed); txtCurrentSpeed.setText(strCurrentSpeed + " " + strUnits); } private boolean useMetricUnits() { // TODO Auto-generated method stub CheckBox chkUseMetricUnits = (CheckBox) this.findViewById(R.id.chkMetricUnits); return chkUseMetricUnits.isChecked(); } @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub if(location != null) { CLocation myLocation = new CLocation(location, this.useMetricUnits()); this.updateSpeed(myLocation); } } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } @Override public void onGpsStatusChanged(int event) { // TODO Auto-generated method stub } }

Si desea convertir Metros / Segundo a kmph-1, entonces necesita multiplicar los Metros / Segunda respuesta de 3.6

Velocidad desde kmph-1 = 3.6 * (Velocidad desde ms-1)


public class MainActivity extends Activity implements LocationListener {

agregar implementos LocationListener junto a la actividad

LocationManager lm =(LocationManager) this.getSystemService(Context.LOCATION_SERVICE); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); this.onLocationChanged(null);

LocationManager.GPS_PROVIDER, 0, 0, el primer cero representa minTime y el segundo para minDistance en el que actualiza sus valores. Cero significa básicamente actualizaciones instantáneas que pueden ser malas para la vida útil de la batería, por lo que es posible que desee ajustarlo.

@Override public void onLocationChanged(Location location) { if (location==null){ // if you can''t get speed because reasons :) yourTextView.setText("00 km/h"); } else{ //int speed=(int) ((location.getSpeed()) is the standard which returns meters per second. In this example i converted it to kilometers per hour int speed=(int) ((location.getSpeed()*3600)/1000); yourTextView.setText(speed+" km/h"); } } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderDisabled(String provider) { }

No te olvides de los permisos

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>