почему мобильный телефон GPS предоставляет одни и те же координаты в разных местах - PullRequest
0 голосов
/ 25 октября 2018

Предыстория: Сейчас я работаю над приложением для Android, чтобы отслеживать транспортные средства, где мне нужно было каждые 10 секунд получать местоположение устройства, как и было принято решением руководства.Мы уже разработали это приложение, которое предоставляет нам обновленное местоположение в соответствии с нашим ожидаемым временным интервалом.

Проблема: Когда автомобили едут по дорогам, приложение выдает нам правильные координаты, как и ожидалосьинтервал времени, но иногда 5-20 минут он обеспечивает те же координаты, но транспортное средство находится в другом месте.

Проверка кода: 1) Мы используем метод с именем getLocation () внутри LocationClass, который предоставляет нам широту и долготу текущего местоположения устройства.

private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 5;
private static final long MIN_TIME_BW_UPDATES = 1000*20; 

public Location getLocation(Context context) {
    Location location=null;
    try {
        locationManager = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(context,"Please! Provide Location Access Permission.....", Toast.LENGTH_LONG).show();
                return TODO;
            }

            // if GPS Enabled get lat/long using GPS Services               

                if(isGPSEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS Enabled", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                            location.setProvider("GPS");                              
                        }
                    }
                }
                if (isNetworkEnabled && location==null) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                            location.setProvider("AGPS");                                
                        }
                    }
                }                

        }

    } catch (Exception e) {
        e.printStackTrace();           
    }

    return location;
}

2) Мы повторяем этот метод с использованием таймера службы с именем GPSTracker через фиксированный интервал времени.

public class GPSTracker extends Service implements LocationListener {
private Timer mTimer = null;
private Handler mHandler = new Handler();
Location location;
@Override
public void onCreate() {
    super.onCreate();

    if (mTimer != null) {
        mTimer.cancel();
    } else {
        // recreate new
        mTimer = new Timer();
    }
    // schedule task
    mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 10 * 1000, 10 * 1000);
}

class TimeDisplayTimerTask extends TimerTask {

    @Override
    public void run() {
        // run on another thread
        mHandler.post(new Runnable() {

            @Override
            public void run() {
                location=new Location("");
                LocationCls cls = new LocationCls();
                location = cls.getLocation(getBaseContext());
            }

        });
    }

}
}

Я пытаюсь решить эту проблему 2 долгих дня, но пока не нашел ни одной проблемы с кодированием или ее решения.Любое решение или предложение высоко ценится.

Заранее спасибо ....

1 Ответ

0 голосов
/ 17 января 2019

Согласно вашему коду,

locationManager.getLastKnownLocation (LocationManager.NETWORK_PROVIDER)

getLastKnownLocation предоставляют последние известные координаты, если не найдено координат втекущий запросВы должны получить новое местоположение, используя следующий метод ...

@Override
public void onLocationChanged(Location location) {
    double lat=location.getLatitude();
    double lng=location.getLongitude();
}

Оно всегда дает вам новое местоположение вместо последнего известного местоположения.

В другом случае вы можете обслуживать свою проблему, используя LocationServices API .Попробуйте по следующей ссылке: https://guides.codepath.com/android/Retrieving-Location-with-LocationServices-API

...