web-dev-qa-db-ja.com

LocationRequest setInterval(長いミリ秒)とLocationRequest setFastestInterval(長いミリ秒)の違い

私は、Androidで5分ごとに自分のバックグラウンドロケーション更新を書いています。 setIntervalとsetFastestIntervalの違いを知りたい

間隔を5分に設定し、setFastestIntervalを2分に設定した場合。ロケーションの更新は2分ごとに呼び出されます。

違いを知りたいです。このために開発者ページに何が書かれているのか正確に理解できませんでした https://developer.Android.com/reference/com/google/Android/gms/location/LocationRequest.html

また、最初の更新の距離が2番目の更新で20メートルを超える場合にのみ、位置の更新をチェックする組み込み関数はありますか?

ありがとう!

67
TheDevMan

Androidで参照を参照することにより:
https://developer.Android.com/reference/com/google/Android/gms/location/LocationRequest.html

setInterval(long)意味-ロケーションを取得する間隔を設定します。 setFastestInterval(long)は、場所がすぐに利用できる場合、それを取得できることを意味します(つまり、別のアプリが位置情報サービスを使用しています)。

たとえば、アプリケーションを起動し、setInterval(60 * 1000)で登録すると、60秒ごとに更新が取得されます。
今、setFastestInterval(10 * 1000)を呼び出します。位置情報サービスを使用する唯一のアプリである場合、60秒ごとに更新を受信し続けます。別のアプリが更新の割合が高い位置情報サービスを使用している場合、より多くの位置情報の更新を取得します。

アプリが消費するバッテリー寿命に良い影響を与えると思います。アップデートが利用可能であればそれを望むと言いながら、あなたが待つことができる最大時間を定義します。バッテリーの消費は、あなたではなく、より頻繁な更新を要求したアプリに加算されます。

92
Ohad Zadok

また、最初の更新の距離が2番目の更新で20メートルを超える場合にのみ、位置の更新をチェックする組み込み関数はありますか?

LocationRequestには、更新間の最小距離を設定するために使用できるメソッドがあります。

int minimumDistanceBetweenUpdates = 20;

LocationRequest request = new LocationRequest();
request.setMinimumDisplacement(minimumDistanceBetweenUpdates);
// ... request.setInterval(interval); etc
9
user2120910

私はAndroidで毎分5分の間隔で自分自身のバックグラウンド位置更新を書いています。 setIntervalsetFastestIntervalの違いを知りたい

setFastestInterval();Locationを要求する優先度が高いと仮定します。 setFastestInterval();を設定したアプリに対しては、(他のアプリがLocationServicesを使用している場合でも)最初に実行されるアプリになります。

例:APP1setFastestInterval(1000 * 10)があり、APP2setInterval(1000 * 10)がある場合、両方のAPPSに同じ要求間隔がある。ただし、最初の要求を行うのはAPP1です。 (これは私が理解したことです、答えは多分間違っています)

I setInterval to5 minsおよびsetFastestInterval to2 mins。 _location update_は2分ごとに呼び出されます。

setFastestInterval()とともにsetInterval()を使用している場合、アプリはsetFastestInterval()で指定された時間だけリクエストを試みます。そのため、アプリはリクエストを行います。 every2mins

また、最初の更新の距離が2番目の更新で20メートルを超える場合にのみ、位置の更新をチェックする組み込み関数はありますか?

20メートルごとにリクエストを行う場合、LocationModelを作成できます

_    public class LocationModel {
    private double latitude;

    private double longitude;
    public LocationModel(){
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }
}
_

最初のリクエストでは、latlongを現在の場所に設定します(getLastLocation();を使用)

次にonLocationChanged()オブジェクトからデータを取得し、_new Current Location_と比較します

_float distanceInMeters = distFrom((float)locationObj.getLatitude(), (float)locationObj.getLongitude(), (float)mCurrentLocation.getLatitude(), (float)mCurrentLocation.getLongitude());
_

SOのユーザーへの提案でもあるこの関数の使用

_public static float distFrom(float lat1, float lng1, float lat2, float lng2) {
    double earthRadius = 6371; //kilometers
    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));
    float dist = (float) (earthRadius * c);

    return dist;
}
_
6
hrskrs

setInterval(long millis)この間隔は不正確です。更新プログラムをまったく受信しない場合があります(利用可能な場所のソースがない場合)。また、リクエストよりも速くそれらを受信する場合があります(他のアプリケーションがより速い間隔で位置をリクエストしている場合)。更新を受け取る最速レートは、setFastestInterval(long)で制御できます。デフォルトでは、この最速レートは間隔頻度の6倍です。

setFastestInterval(long millis)setInterval(long)とは異なり、このパラメーターは正確です。アプリケーションは、この値よりも速くアップデートを受け取ることはありません。このメソッドを呼び出さないと、最速の間隔が選択されます。アクティブな間隔(setInterval(long))よりも速い値になります。

1
Haritha Reddy