0

私は位置認識アプリを開発していますが、位置の更新をリクエストすると、非常に古い位置が表示されることがあります(更新されないかのように)、または複数の位置通知が表示されます。私はこの問題をさらに掘り下げ始め、ANDROIDSロケーションリスナーがどのように機能するかを説明するこのブログを見つけました。

要するに、私の解釈ではrequestLocationUpdates、あなたが1つのロケーションオブジェクトを取得するだけでなく、複数を取得するということです。そこで、私は複数の中から最適な場所のオブジェクトを選択する方法を見つけようとし始め、Androidのドキュメント(「現在の最適な見積もりの​​維持」のセクションの下)でアルゴリズムを見つけました。

そのセクションのコードブロックを自分のアプリに実装する方法について混乱しています。コードのブロックは2つのパラメーターを受け取り、locationそれらcurrentbestlocationを比較します。

  1. 比較するコードブロックの2つのロケーションオブジェクトをどのように宣言しますか?(コード例または擬似コードをいただければ幸いです!)
  2. locationlistener複数のロケーションオブジェクトを提供する私の理解は正しいですか?
  3. GOOGLESコードを自分のコードに実装するにはどうすればよいですか?下記参照:

以下の私のコード:

public class MainActivity extends Activity {
    LocationManager lm;
    LocationListener ll;
    private Location previousLocation;

    public void onCreate(Context context, Intent intent) {    
        lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
        ll = new myListener();
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 6000, 1000, ll);
    }

    private class myListener implements LocationListener {      
        public void onLocationChanged(Location loc) {
        if (previousLocation == null) {
               previousLocation = loc;
            } else {
                if (isBetterLocation(loc, previousLocation)) {
                //NOTIFICATION NEW LOCATION IS BETTER
                } else {
                //NOTIFICATION PREVIOUS LOCATION IS BETTER
                }
            }
        }
        public void onProviderDisabled(String provider) {
        }
        public void onProviderEnabled(String provider) {
        }
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    }

    //GOOGLE ANDROID DOCUMENTATION CODE FOR MAINTAINING CURRENT BEST ESTIMATE
    private static final int TWO_MINUTES = 1000 * 60 * 2;

    protected boolean isBetterLocation(Location location, Location currentBestLocation) {
        if (currentBestLocation == null) {
            // A new location is always better than no location
            return true;
        }

        // Check whether the new location fix is newer or older
        long timeDelta = location.getTime() - currentBestLocation.getTime();
        boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
        boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
        boolean isNewer = timeDelta > 0;

        // If it's been more than two minutes since the current location, use the new location
        // because the user has likely moved
        if (isSignificantlyNewer) {
            return true;
        // If the new location is more than two minutes older, it must be worse
        } else if (isSignificantlyOlder) {
            return false;
        }

        // Check whether the new location fix is more or less accurate
        int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
        boolean isLessAccurate = accuracyDelta > 0;
        boolean isMoreAccurate = accuracyDelta < 0;
        boolean isSignificantlyLessAccurate = accuracyDelta > 200;

        // Check if the old and new location are from the same provider
        boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider());

        // Determine location quality using a combination of timeliness and accuracy
        if (isMoreAccurate) {
            return true;
        } else if (isNewer && !isLessAccurate) {
            return true;
        } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
            return true;
        }
        return false;
    }

    private boolean isSameProvider(String provider1, String provider2) {
        if (provider1 == null) {
            return provider2 == null;
        }
            return provider1.equals(provider2);
    }
}
4

1 に答える 1

1

を使用しLocationManagerて位置情報の更新を要求すると、停止するように指示するか、アプリケーションが強制終了されるまで、更新情報が提供され続けます。このようにして、デバイスの現在の位置を一定の間隔で監視できるため、デバイスがいつ移動したかを知ることができます。位置情報の更新が 1 つだけ必要な場合は、十分な精度の位置情報の修正を受け取ったら、 に電話してlocationManager.removeUpdates(listener)ください。

Gingerbread 以降を実行するデバイスのみをサポートする予定の場合は、このrequestSingleUpdate(java.lang.String, android.location.LocationListener, android.os.Looper)方法を使用することもできます。

最初に行うことは、ロケーション リスナーを宣言し、更新を登録することです。このコードで開始する必要があります。

public class MyActivity extends Activity implements LocationListener {
    /** Cache the last location fix received. */
    private Location mLastLocationReceived;

    @Override
    public void onResume() {
        super.onResume();

        // Register our location listener
        LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 500, this);
    }

    @Override
    public void onPause() {
        super.onPause();

        // Unregister our location listener
        LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
        lm.removeUpdates(this);
    }

    @Override
    public void onLocationChanged(Location location) {
        if (mLastLocationReceived == null) {
            mLastLocationReceived = location;
        } else {
            if (isBetterLocation(location, mLastLocationReceived)) {
                // New location fix is better!
            } else {
                // New location fix is not better!
            }
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
        // Pass
    }

    @Override
    public void onProviderEnabled(String provider) {
        // Pass
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // Pass
    }

    private boolean isBetterLocation(Location newLocation,
            Location oldLocation) {

        // TODO: Implement the logic to determine if the new location is
        // of better quality than the old location. Your application's
        // business logic determines what this method should do.

        return false;
    }

}

isBetterLocationメソッドは常に戻りfalse、実装を提供するのはあなた次第であることに注意してください。ここに良い実装例があります。また、このコードはテストしていませんので、エラーがあればご容赦ください。

于 2012-12-31T23:30:50.940 に答える