web-dev-qa-db-ja.com

融合した位置情報プロバイダーsetsmallestDisplacementがAndroid

こんにちは私はサービスで位置情報の更新を取得するために融合位置プロバイダーApiを実装しました。設定された間隔に従ってonlocationchangedイベントを発生させることができました。ただし、setsmallestDisplacementを10メートルに設定すると、デバイスがまだある場合でもイベントが発生します。誰かがこれに似た問題を抱えていますか?提案を提供してください。以下はコードです

    mlocationrequest = LocationRequest.create();
    mlocationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mlocationrequest.setInterval(60000); // Update location every 1 minute
    mlocationrequest.setFastestInterval(10000);
    mlocationrequest.setSmallestDisplacement(10);


    LocationServices.FusedLocationApi.requestLocationUpdates(
            mGoogleApiClient, mlocationrequest, this);

2つの位置の値の間の距離を見つけるために、この方法を使用しました。

public static float distFrom (float lat1, float lng1, float lat2, float lng2 ) 
{
    double earthRadius = 3958.75;
    double dLat = Math.toRadians(lat2-lat1);
    double dLng = Math.toRadians(lng2-lng1);
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
    Math.sin(dLng/2) * Math.sin(dLng/2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    double dist = earthRadius * c;

    int meterConversion = 1609;

    return new Float(dist * meterConversion).floatValue();
}

しかし、デバイスが静止している場合でも、距離は43.51、49.32、520.02になります。タブレットが室内で使用しているからですか?

20
hemanth kumar

DisplacementがLocationRequestに設定されている場合、Displacementが間隔(intervalおよびfastestInterval)よりも優先されるため、デバイスがまだある場合は位置を取得できません。私が推測できるように-あなたはLocationServices.FusedLocationApi.requestLocationUpdates()に別のLocationRequestオブジェクト(変位セットなし)を渡したのかもしれません。

間隔と変位の両方が設定されている場合、locsがどのように受信されるかについての答えを探していました。私は自分のアプリケーションで自分自身を確認しましたが、以下はLocationRequestのさまざまな構成の動作です:

  1. 変位パラメータが設定されていません
    setIntervalは1分に設定され、最速は1分です。

    私は1分ごとに場所を受け取りました。しかし、それは時々それが速く受信したり遅くなったりするのを見るでしょう、それはsetIntervalが不正確だからです。

06-03 11:46:55.408 25776-25776/MyLocationListener:onLocationChanged。
06-03 11:47:56.008 25776-25776/MyLocationListener:onLocationChanged。
06-03 11:48:18.768 25776-25776/MyLocationListener:onLocationChanged。
06-03 11:49:22.938 25776-25776/MyLocationListener:onLocationChanged。
06-03 11:50:22.948 25776-25776/MyLocationListener:onLocationChanged。
06-03 11:52:22.978 25776-25776/MyLocationListener:onLocationChanged。
06-03 11:53:22.998 25776-25776/MyLocationListener:onLocationChanged。

  1. 変位パラメータは10メートルに設定されています
    setInterval上記の1分。

    デバイスがその距離を移動または横断しない場合、位置情報の更新は受信されません。下のすべてのonLocationChangedの間に10メートル以上歩いたので、locを受け取りました。

06-03 11:26:53.328 16709-16709/MyLocationListener:onLocationChanged。
06-03 11:35:38.318 16709-16709/MyLocationListener:onLocationChanged。
06-03 11:39:16.728 16709-16709/MyLocationListener:onLocationChanged。

39
cgr

onLocationChangedメソッドで異なるlat-longを取得しているため、10を超える変位が記述されている場合があります。そのため、取得しているlat-longを確認し、手動で距離を測定して、クロス検証します。

上記とは別に、もう1つの考えられる理由は優先度の問題です。上記のケースが問題ないと思われる場合は、次のように試してください。

 mlocationrequest = LocationRequest.create();
mlocationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mlocationrequest.setSmallestDisplacement(10);
mlocationrequest.setInterval(60000); // Update location every 1 minute
mlocationrequest.setFastestInterval(10000);
5
Mehul Joisar