web-dev-qa-db-fra.com

Déterminer la vitesse d'un véhicule à l'aide du GPS en android

Je voudrais savoir comment obtenir la vitesse d'un véhicule en utilisant votre téléphone tout en étant assis dans le véhicule en utilisant le GPS. J'ai lu que l'accéléromètre n'est pas très précis. Une autre chose est; le GPS sera-t-il accessible en étant assis dans un véhicule. Cela n'aura-t-il pas le même effet que lorsque vous êtes dans un immeuble?

Voici du code que j'ai essayé mais j'ai plutôt utilisé le FOURNISSEUR DE RÉSEAU. J'apprécierai l'aide. Merci...

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) {}

    }
}
23
John Kulova

Le GPS fonctionne bien dans un véhicule. Le paramètre NETWORK_PROVIDER N'est peut-être pas suffisamment précis pour obtenir une vitesse fiable, et les emplacements du NETWORK_PROVIDER Peuvent même ne pas contenir de vitesse. Vous pouvez vérifier qu'avec location.hasSpeed() (location.getSpeed() renverra toujours 0).

Si vous trouvez que location.getSpeed() n'est pas assez précis ou instable (c'est-à-dire qu'il fluctue considérablement), vous pouvez calculer la vitesse vous-même en prenant la distance moyenne entre quelques emplacements GPS et en divisant par le temps écoulé.

27
Samuel

pour plus d'informations sur le calcul de la vitesse à partir du changement de position GPS dans Android Mobile Device afficher ce lien

Il existe principalement deux façons de calculer la vitesse à partir d'un téléphone mobile.

  1. Calculer la vitesse à partir de l'accéléromètre
  2. Calculer la vitesse à partir de la technologie GPS

Contrairement à l'accéléromètre de la technologie GPS, si vous souhaitez calculer la vitesse, vous devez activer la connexion de données et la connexion GPS.

Ici, nous allons calculer la vitesse à l'aide d'une connexion GPS. Dans cette méthode, nous utilisons la fréquence à laquelle les points de localisation GPS changent au cours d'une même période. Ensuite, si nous avons la distance réelle entre les points de géolocalisation, nous pouvons obtenir la vitesse. Parce que nous avons la distance et le temps. Vitesse = distance/temps Mais obtenir la distance entre deux points de localisation n'est pas très facile. Parce que le monde est un objectif en forme, la distance entre deux points géographiques est différente d'un endroit à l'autre et d'un angle à l'autre. Nous devons donc utiliser "Haversine Algorithm"

enter image description here

Nous devons d'abord donner l'autorisation pour obtenir les données de localisation dans le fichier manifeste

Créez l'interface graphiqueenter image description here

enter image description here

enter image description here

   <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?"/>

Faites ensuite une interface pour obtenir la vitesse

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);

}

Implémentez la logique pour obtenir la vitesse en utilisant la position 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;
      }



}

Combinez la logique à l'interface graphique

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 vous souhaitez convertir des mètres/seconde en kmph-1, vous devez multiplier la réponse en mètres/seconde de 3,6

Vitesse de kmph-1 = 3,6 * (Vitesse de ms-1)

27
ISURU
public class MainActivity extends Activity implements LocationListener {

ajouter des implémentations LocationListener à côté de Activity

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

LocationManager.GPS_PROVIDER, 0, 0, Le premier zéro correspond à minTime et le second à minDistance dans lequel vous mettez à jour vos valeurs. Zéro signifie essentiellement des mises à jour instantanées qui peuvent nuire à la durée de vie de la batterie, vous pouvez donc l'ajuster.

     @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) {


}

N'oubliez pas les autorisations

 <uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
3
ORY

Nous pouvons utiliser 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();
            }
1
Sam