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) {}
}
}
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é.
Il existe principalement deux façons de calculer la vitesse à partir d'un téléphone mobile.
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"
Nous devons d'abord donner l'autorisation pour obtenir les données de localisation dans le fichier manifeste
<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)
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"/>
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();
}