2012-01-10 114 views
3

我一直試圖通過GPS的幫助獲得速度。當我的電話掉線時,我想獲得Gps數據(緯度 - 經度 - 速度)。從Android上獲取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或70km/h ..

您的想法是什麼?

+0

位置返回正確嗎? – znat 2012-01-10 18:13:13

+0

是的,地點返回正確。但首先是經緯度或拳頭的經度和緯度值有時可能相同。我不明白.. – iremce 2012-01-10 18:16:06

+0

我想知道你的實施是否正確。監聽器應該返回調用服務/線程/活動與回調(檢查這篇文章:http://stackoverflow.com/questions/3145089/what-is-the-simplest-and-most-robust-way-對獲得-的用戶,當前定位功能於一個)。另外,我認爲它會在手機進入睡眠模式時停止工作 – znat 2012-01-10 18:40:06

回答

0

我想知道你的實現是否正確。我認爲問題在於位置更新未連接到新位置的修復。所以如果你的gps沒有做出新的修復,那麼當前的位置將被重新發送。

一個邏輯可能是每X秒,你打開你的requestLocationUpdates()處理的位置,如果/當它收到並關閉更新(removeUpdates()) 檢查這個帖子的一個很好的例子問題對我來說):What is the simplest and most robust way to get the user's current location on Android?

上面的例子很明白要理解。 棘手的部分是在服務中使用它,因爲當手機進入睡眠模式時服務不起作用。在這裏,您可以使用commonsware component來解決這個問題。

我已經使用和混合這兩個組件來建立一個位置服務,它是穩定的。

希望它有幫助

+0

謝謝..我將分析您建議的示例。 – iremce 2012-01-10 19:21:01