Получение скорости от GPS на Android Расчет расстояния и времени - PullRequest
3 голосов
/ 10 января 2012

Я пытался набрать скорость с помощью GPS. Я хотел бы получить данные GPS (широта-долгота-скорость), когда мой телефон упал.

Когда телефон упал, данные GPS были получены и отправлены на мой сервер. Для этой цели я использовал темы. Каждый поток получает данные GPS и отправляет их на сервер.

Моя проблема в скорости. Я получил скорость расчета расстояния между двумя местами и временем (скорость = расстояние / время)

Тема составляет:

@Override
public void run() {

    Looper.prepare();

    float distance = 0.0f;
    float[] results = new float[1];
    Long longValue = new Long(11);
    double firstLatitude;
    double firstLongitude;
    long firstTime;
    float speedOfDevice = 0.0f;

    //for sendin gps datas to web server
    ReportLocation reportObj = new ReportLocation(this);

    locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);


    locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);


    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);

    //latitude, longitude and timeOffix is set in location listener
    firstLatitude = latitude;
    firstLongitude = longitude;
    firstTime = timeOfFix;

    // Waiting 1.5 second 
    try {
        Thread.sleep(1500);
    } catch (InterruptedException e) {
        e.printStackTrace();
        Toast.makeText(this, "Sleep exception", Toast.LENGTH_LONG).show();
    }


    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);


    if( timeOfFix != firstTime ) {
        Location.distanceBetween(firstLatitude, firstLongitude, latitude, longitude, results);
        distance = results[0];
        longValue = new Long(timeOfFix - firstTime );
        speedOfDevice = 3600 * distance / ( longValue.floatValue() ); 
    }

    try {

        reportObj.send( Double.toString(firstLatitude),  Double.toString(firstLongitude), Float.toString( speedOfDevice ) );

    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        Toast.makeText(this, "Client protokol exception ", Toast.LENGTH_LONG).show();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        Toast.makeText(this, "IO exception "+e.getMessage(), Toast.LENGTH_LONG).show();
    }


    handler.sendEmptyMessage(0);

    Looper.loop();
}

}


class MyLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        if (location != null) {

            locManager.removeUpdates(locListener); 

            latitude = location.getLatitude();
            longitude = location.getLongitude();
            timeOfFix = location.getTime();

        }  
    }

    @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
    }
}

Я попробовал свою программу в машине, которая в движении. Но я не смог получить правильные данные о скорости. Например, 7.31365, 8.29663 и т. Д. Они должны быть 50-60 или 70 км / ч.

Что ты думаешь?

1 Ответ

0 голосов
/ 10 января 2012

Мне интересно, правильна ли ваша реализация. Я думаю, что проблема в том, что обновления местоположения не связаны с исправлением нового местоположения. Так что, если ваш GPS не сделал новое исправление, то текущее местоположение будет отправлено снова.

Логика может заключаться в том, что каждые X секунд вы включаете свой requestLocationUpdates () обрабатывает местоположение, если / когда оно получено, и отключаете обновления (removeUpdates ()) Посмотрите на этот пост отличный пример (который решил для меня много проблем): Какой самый простой и надежный способ получить текущее местоположение пользователя на Android?

Пример выше понятен. Самое сложное - использовать его в сервисе, так как сервис не работает, когда телефон переходит в спящий режим. Здесь вы можете использовать компонент commonsware , чтобы преодолеть это.

Я использовал и смешал эти два компонента для настройки службы определения местоположения, и она стабильна.

Надеюсь, это поможет

...