2

現在、車両の移動距離を計算するアプリケーションに取り組んでいます。私の要件は、車の運転中に、私の Android デバイスが移動した合計距離を計算し、この情報をサーバーに送信することです。これを行うために、Android のロケーション マネージャー API を使用し、基準を設定して getBestProvider を使用しました。このようにして、GPS またはネットワークを使用して緯度と経度を取得できます。以下は、このコード スニペットです。

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);    
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setPowerRequirement(Criteria.POWER_HIGH);
provider = locationManager.getBestProvider(criteria, false);

locationManager.requestLocationUpdates(provider,30000,5, this);

onLocationChanged() コールバック メソッドは、毎回緯度と経度を提供します。常に以前の座標を保存し、新しい座標を取得すると、distanceBetween() API を使用して 2 つの間の距離を見つけます。以下は、このコード スニペットです。

public void onLocationChanged(Location location) {
                                    findLatLongDistance(location);
}

private void findLatLongDistance(Location location) {
            // TODO Auto-generated method stub
            try{
                  Date date = new Date();
                  TimeStamp2 = sdf.format(date);

                              getSavedLatLong();//get lat and long from preference
                          Location locationB = new Location("point B"); 

                          locationB.setLatitude(location.getLatitude()); 
                          locationB.setLongitude(location.getLongitude()); 

                          Location locationA = new Location("point A"); 

locationA.setLatitude(prelat_val);  //lat from pref                       locationA.setLongitude(prelong_val);  //long from pref

                          if(prelat_val>0.0 && prelong_val>0.0){
                              Toast.makeText(LocationService.this,"Location Odometer Sum "+odometer_sum, Toast.LENGTH_LONG).show();

                                  float distance2 = getDistance(prelat_val,prelong_val,location.getLatitude(),location.getLongitude());
                                  odometer_sum = odometer_sum + (distance2/1000);
                                  Toast.makeText(LocationService.this,"Lat "+prelat_val+"Long "+prelong_val+"Sum "+odometer_sum, Toast.LENGTH_LONG).show();

                          }

                        saveData(lat,lng,odometer_sum);
            }catch(Exception e){
                  e.printStackTrace();
            }
      }


public float getDistance(double d, double e, double f, double g) {

            float [] dist = new float[2];

            Location.distanceBetween(d,e,f, g, dist);
          return dist[0] ;
      }

これは、ここで直面している問題のリストです。

  1. それが提供する場所は正確ではありません。このアプリを 5 km の距離でテストしたところ、約 300 ~ 400 メートルの差があります。
  2. モバイルが長時間同じ場所にある場合、常に異なる緯度と経度が表示されます。上記のコード スニペットを確認すると、requestLocationUpdates() で、30 秒の時間間隔と 5m の距離が設定されています。ここで私たちが考えたのは、モバイル デバイスが 5 メートルの距離を移動し、30 秒間隔を超えると、新しい緯度と経度が提供されるということです。しかし、実際には、デバイスの動きに関係なく、30 秒ごとに座標が提供されます。この問題を解決する方法がわかりません。
  3. デバイスが動いている間、正確な値を取得する方法。コードでさらに何かを行う必要がありますか?

さまざまなオプションを試すのに本当に何時間も費やしています。しかし、私はここで何かが欠けていると感じています。これについて私を助けてください。前もって感謝します..

ありがとう、

4

1 に答える 1

0

requestLocationUpdates()のminTime値は30秒​​です。正確な距離を計算しようとするアプリには長すぎます。私はlocationManager.requestLocationUpdates(provider, 0, 5, locationListener); 自分のコードで長い間使用してきましたが、正確な更新を取得しています。これはバッテリーを非常に速く消耗させますが。したがって、精度とバッテリー寿命のバランスを取り、アプリに適したものを確認するには、さまざまな値を試す必要があります

于 2013-03-21T05:40:45.603 に答える