2012-01-10 16 views
3

GPSの助けを借りて速度を上げようとしています。私は電話が落ちたときにGps datas(緯度経度 - 速度)を取得したいと思います。AndroidでGPSから速度を取得する距離と時間を計算する

電話が切れたときに、gpsデータが取得され、自分のサーバーに送信されます。この目的のために、スレッドを使用しました。各スレッドはgpsデータを取得し、それらのサーバに送信します。

私の問題はスピード値です。私は2つの場所と時間 間の速度算出距離を得た(速度=距離/時間)

スレッドを作る:

@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 km/hでなければなりません..

あなたの考えは?

+0

返された場所は正しいですか? – znat

+0

はい、正しい場所が返されました。しかし、最初に、経度と緯度またはfistLongitudeと経度の値は同じかもしれません。私はそれを理解していません.. – iremce

+0

あなたの実装が正しいかどうか疑問に思っています。リスナーはコールバックで呼び出し元のサービス/スレッド/アクティビティに戻るべきです(この記事をチェックしてください:http://stackoverflow.com/questions/3145089/what-is-the-simplest-andmost-robust-way-ユーザー獲得 - 現在 - ロケーション - イン - a)。さらに、私はそれが電話がスリープモードに行くときに動作を停止すると思う – znat

答えて

0

あなたの実装が正しいかどうかは疑問です。私は問題は、場所の更新が新しい場所の修正に接続されていないことだと思います。あなたのGPSが新しい修正をしなかった場合、現在の場所が再び送信されます。

ロジックは、リクエストが受信されたときにその場所を処理し、更新を無効にする場合(removeUpdates())、リクエストを有効にすることができます。 この記事では、私の問題):What is the simplest and most robust way to get the user's current location on Android?

上記の例はわかりません。 携帯電話がスリープモードになったときにサービスが動作しないため、難しい部分はサービスで使用することです。ここではこれを克服するためにcommonsware componentを使用できます。

私はこれらの2つのコンポーネントを使用して混在させて位置情報サービスをセットアップしており、安定しています。

希望する

+0

ありがとう..私はあなたが提案した例を分析します。 – iremce

関連する問題