14

このCriteriaクラスには、 と の 2 つの定数がACCURACY_HIGHあり、これらは がより高精度の位置更新を返すACCURACY_FINEように要求するために使用されているようです。これらの定数のそれぞれについてドキュメントLocationManagerに記載されている内容は次のとおりです。

public static final int ACCURACY_FINE (API レベル 1 で追加)

  A constant indicating a finer location accuracy requirement
  Constant Value: 1 (0x00000001)

public static final int ACCURACY_HIGH (API レベル 9 で追加)

  a constant indicating a high accuracy requirement - may be used for horizontal, altitude, speed or bearing accuracy. For horizontal and vertical position this corresponds roughly to an accuracy of less than 100 meters.
  Constant Value: 3 (0x00000003) 

これら2つの定数のどちらが最高レベルの精度を提供する(つまり、必要とする)か知っている人はいますか?

4

3 に答える 3

22

ソース コードからわかるように、ACCURACY_FINE は ACCURACY_COARSE とグループ化されており、定数値はそれぞれ 1 と 2 です。ACCURACY_LOW、MEDIUM、および HIGH は、定数値 1、2、および 3 でグループ化されます。

setAccuracy は COARSE または FINE のいずれかを想定して返すようですが、setVerticalAccuracy、setHorizo​​ntalAccuracy、setSpeedAccuracy、および setBearingAccuracy は LOW、MEDIUM、または HIGH を想定しています。さらに、setAccuracy を呼び出すと、次のように水平方向の精度が設定されます。

public void setAccuracy(int accuracy) {
    if (accuracy < NO_REQUIREMENT || accuracy > ACCURACY_COARSE) {
        throw new IllegalArgumentException("accuracy=" + accuracy);
    }
    if (accuracy == ACCURACY_FINE) {
        mHorizontalAccuracy = ACCURACY_HIGH;
    } else {
        mHorizontalAccuracy = ACCURACY_LOW;
    }
}

非常にややこしいですが、少しでも理解していただければ幸いです。grepcodeのソースへのリンクは次のとおりです。ローカルにソースがない場合は、ダウンロードして自分で確認できます。

于 2013-07-26T06:42:23.440 に答える
8

どちらの定数も最高の精度を意味しますが、異なる方法を対象としています。ドキュメントから(質問がされてから更新された可能性があります):

ACCURACY_FINEsetAccuracyの有効な入力です。

ACCURACY_HIGHsetBearingAccuracysetHorizo​​ntalAccuracysetSpeedAccuracyおよびsetVerticalAccuracyの有効な入力です。

このモデル化の考え方は、FINECOARSEが正反対の 2 つのみの選択肢を与えるのに対しLOWMEDIUMHIGHはより微妙な区別を可能にするということだと私は信じています。(疑問が残ります。なぜと のみをsetSpeedAccuracy許可してそのモデリングを嘲笑します。しかし、これはドキュメントまたは設計のいずれかのバグである可能性があります。:))LOWHIGH

OPで述べたように、FINE-COARSEのAPIレベル1とは対照的に、APIレベル9であるこれらの値を後で導入しました。npaceによって検出されたコードは、Android 開発者が内部的にすべてを LOW から HIGH の値の範囲の名前と値にマッピングして、内部で一貫性を確保していることを示しています。

于 2014-04-06T09:54:50.390 に答える
-1

位置の精度を判断する基準はいくつかあります

デバイスがリアルタイムの位置情報を提供し始めたら、各結果の精度を確認し、要件に基づいて特定の量を超えるものを拒否することを検討することをお勧めします. 位置情報プロバイダーの実行時間が長くなり、デバイスに遮るもののない空のビューと良好なセルラー接続がある場合、通常、精度は特定のポイントまで向上し、その後横ばいになり、その後変動します. 各 GPS 位置情報の精度を確認する方法を示す疑似コード スニペットを次に示します。

1
2
3

精度のしきい値の大まかな例を次に示します。これらの異なるしきい値がアプリケーションの動作にどのように影響するかについては、要件が異なる場合があります。これらは、現在地をおおよその住所に変換するジオコーディングを必要とする例でした。結果に応じて、アプリケーションはユーザーにさまざまなフィードバックを返しました。

Rooftop  <= 10 meters (desired result)
Street >10 meters and <= 100 meters (let user know it’s close but not perfect. Good enough?)
Neighborhood > 100 meters and  <= 500 meters (give visual feedback that accuracy is low)
City > 500 meters and <= 2000 meters (ask user to verify city name from a list)
County > 2000 meters (prompt for manual location input)

独自のユースケースを考慮してください。アプリが単に NFL の試合で空いている駐車場を見つけるのに役立つだけの場合、100 メートル (328 フィート) を超える精度値を完全に拒否する可能性があります。半径 5 マイル (8000 m) 以内にある歯科医院のリストを返すアプリを作成できます。または、天気予報アプリは、あなたがどの都市にいるのかを大まかに知るだけでよい場合があります。これらは、考えさせるのに役立つアイデアにすぎません。

public void onLocationChanged(Location location) {
         if(location.getAccuracy() < 100.0 && location.getSpeed() < 6.95){
              //Do something
         }
         else{
              //Continue listening for a more accurate location
         }
于 2015-07-23T12:35:38.100 に答える