Определение скорости автомобиля с помощью GPS в android
Я хотел бы знать, как получить скорость автомобиля с помощью телефона, сидя в автомобиле с помощью gps. Я читал, что акселерометр не очень точен. Другое дело, будет ли GPS доступен, сидя в автомобиле. Не будет ли это иметь тот же эффект, что и когда вы находитесь в здании?
Вот некоторый код, который я пробовал, но вместо него я использовал провайдера сети.Я буду признателен за помощь. Спасибо...
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) {}
}
}
4 ответа:
GPS прекрасно работает в автомобиле. Настройка
Если вы обнаружите, чтоNETWORK_PROVIDER
может быть недостаточно точной, чтобы получить надежную скорость, а местоположения изNETWORK_PROVIDER
могут даже не содержать скорости. Вы можете проверить это с помощьюlocation.hasSpeed()
(location.getSpeed()
всегда будет возвращать 0).location.getSpeed()
недостаточно точен или он нестабилен (т. е. сильно колеблется), то вы можете вычислить скорость самостоятельно, взяв среднее расстояние между несколькими точками GPS и разделив на время, прошедшее с момента запуска.
В основном есть два способа рассчитать скорость с мобильного телефона.
- вычислить скорость по акселерометру
- вычисление скорости по технологии GPS
В отличие от акселерометра из технологии GPS, если вы собираетесь рассчитать скорость, вы должны включить подключение к данным и GPS-соединение.
Здесь мы будем вычислять скорость использование GPS-соединения. В этом методе мы используем, как часто меняются точки местоположения GPS в течение одного периода времени. Тогда, если у нас есть реальное расстояние между точками геолокации, мы можем получить скорость. Потому что у нас есть расстояние и время. скорость = расстояние / время Но получить расстояние между двумя точками расположения не очень просто. Поскольку мир-это цель в форме, расстояние между двумя точками гео отличается от места к месту и от угла к углу. Так что у нас есть использовать алгоритм "гаверсинус"
Сначала мы должны дать разрешение на получение данных о местоположении в файле манифеста
<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?"/>
затем сделайте интерфейс, чтобы получить скорость
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); }
реализуйте логику, чтобы получить скорость с помощью 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; } }
объединить логику с графическим интерфейсом
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 } }
Если вы хотите преобразовать метры в секунду в км / ч-1, то вам нужно умножить ответ метры в секунду на 3,6
Скорость от км / ч-1 = 3,6 * (скорость от МС-1)
public class MainActivity extends Activity implements LocationListener {
Добавить реализует LocationListener рядом с 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, первый ноль означает minTime, а второй-minDistance, в котором вы обновляете свои значения. Ноль означает в основном мгновенные обновления, которые могут плохо сказаться на времени автономной работы, поэтому вы можете настроить его.
@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) { }
Не забудьте разрешения
<uses-permission android:name="android.permission.ACCESS_FINE_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(); }