3

デバイスの最も正確な位置を可能な限り短時間で特定しようとしています。

データをジオポイントとして保存し、マップビューに表示しています。

デバイスで最後に GPS を有効にして位置情報をロックしたとき、現在地から約 80 マイル離れていました。

ロケーションマネージャーのセットアップとロケーションリスナーがあります。

これを行うと、NULL になります。

  myLocOverlay = new MyLocationOverlay(this, mapView);
  GeoPoint test = myLocOverlay.getMyLocation();

しかし、次の数行で;

  myLocOverlay.enableMyLocation();      
  mapView.getOverlays().add(myLocOverlay);

これにより、地図上のオーバーレイに現在地が表示されます。ネットワーク プロバイダーを使用していますが、GPS の修正も試みています (私は屋内にいて、最上階の近くにいないため、できません)。

このようにジオポイントを構築すると;

    if(lm.getLastKnownLocation("gps") != null) 
    {
     test = new GeoPoint(
        (int) (lm.getLastKnownLocation("gps").getLatitude() * 1E6), 
        (int) (lm.getLastKnownLocation("gps").getLongitude() * 1E6));
    }

    else
    {

    if(lm.getLastKnownLocation("network") != null) 
    {
     test = new GeoPoint(
       (int) (lm.getLastKnownLocation("network").getLatitude() * 1E6), 
       (int) (lm.getLastKnownLocation("network").getLongitude() * 1E6));
    }
    //bad things
    }

その後、混乱する結果が得られます。デバイスの GPS プロバイダーを無効にすると、コードはネットワーク プロバイダーに移動し、かなり正確な結果が得られます。GPS プロバイダーを有効にすると、ジオポイントは、デバイスが GPS ロックを取得することを最後に許可した場所として返されます。

上記の結果を避けたいので、使用を検討していました。

GeoPoint test = myLocOverlay.getMyLocation();

しかし、上で言ったように、私はそれから NULL を取得します。

GPS とネットワークの両方からジオポイントを取得して比較し、ネットワークの場所から 1 マイル離れている場合は GPS の結果を無視します。getMyLocation() が機能しないのはなぜですか? myLocOverlay がマップビューに表示しているものの GeoPoint を返すべきではありませんか?

4

2 に答える 2

3

まだ修正を取得していないため、null が返される場合があります。LocationListenerネットワーク ソースと GPS ソースの両方からの更新を受け入れるを登録する必要があります。その後、位置情報の更新を取得したら、位置情報の精度を確認して、それを使用するかどうかを決定できます。

于 2010-03-11T21:26:41.133 に答える
2

ジオポイントの要求が速すぎると思います。MyLocationOverlay は、独自のリスナーを使用して修正を取得します。そして、それがどれくらい古いかを調べてGPS修正を求めている可能性があります。それが古すぎる場合は、ネットワーク修正を取得し、GPS修正を待っている間にそれを使用します。

これは、バックグラウンドで gps チップセット、gsm モデム、および Web バックエンドと通信することを意味します。
プログラムが次の行に移動する必要がある時間では、それは不可能です。

UI ではかなり瞬時に見えますが、それは人間の目で測定されます。

CaseyB からの回答を使用して、両方のプロバイダーに独自の gps リスナーを登録し、使用する座標を自分で決定できます。これを行いたい場合は、最後の修正の時刻 (Location.getTime()) と位置の精度を取得するメソッドがあります。

2 番目の可能性は、少し待って、呼び出しがまだ null を返すかどうかを確認してから、もう少し待つことです。

于 2010-03-12T10:36:36.363 に答える