1

ネットワークと GPS という 2 つの異なるプロバイダーから位置情報を取得しようとしています。

で minTime 1 分と minDistance 300 メートルを使用していrequestLocationUpdatesます。これらのパラメーターを使用すると、1 分間 (プロバイダーごと) に複数の更新を取得することは期待できません。問題は、それよりも頻繁に更新を取得していることです (1 分間に 1 回以上)。なんで?

デモ用のコードを次に示します。

    mLocationManager.removeUpdates(listener);
    if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, TEN_SECONDS*6, TEN_METERS*30, listener);

    if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) 
        mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, TEN_SECONDS*6, TEN_METERS*30, listener);

リスナーは次のとおりです。

private final LocationListener listener = new LocationListener() 
{

    @Override
    public void onLocationChanged(Location location) 
    {
        if(location.getProvider().equals(LocationManager.NETWORK_PROVIDER))
            updateUILocation(location,LocationService.this.gpsLocation);
        else
            updateUILocation(LocationService.this.networkLocation, location);   
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

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

UpdateUILocation:

private void updateUILocation(Location networkLocation,Location gpsLocation) 
{
    Location location = null;
    if(gpsLocation == null || gpsLocation.getAccuracy() > 800)
    {
        if(!(networkLocation == null || networkLocation.getAccuracy() > 800))
            location = networkLocation;
    }
    else
        if(networkLocation == null)
        {
            if(gpsLocation.getAccuracy() < 800)
                location = gpsLocation;
        }
        else
            if(gpsLocation.getAccuracy() < networkLocation.getAccuracy() && gpsLocation.getAccuracy() < 500)
                location = gpsLocation;
            else
                if(networkLocation.getAccuracy() < 800)
                    location = networkLocation;
    if(location!=null)
    {
         if (mGeocoderAvailable) 
            doReverseGeocoding(location);
    }

    // Bypass reverse-geocoding only if the Geocoder service is available on the device.

}

doReverseGeocoding は位置をテキストに変換し、ハンドラーを呼び出します。

    mHandler = new Handler() 
    {
        public void handleMessage(Message msg) 
        {
            if(msg.what == UPDATE_ADDRESS) // msg.what == 1
            {
                LocationService.this.address = (String) msg.obj;
                new SendLocation(LocationService.this.id,(String)msg.obj); //send the location to the db
                LocationService.this.gpsLocation = null; //reset gps value
                LocationService.this.networkLocation = null; //reset network value
            }
        }
    };

運転中にこのアプリケーションをテストしました (つまり、minDistance パラメーターは重要ではありません)。1 分間に 1 回以上の位置情報の更新を受け取りました。

テスト中に受け取った場所は次のとおりです(場所はヘブライ語なので無視してください。時間を探してください):http://imrip.interhost.co.il/

4

1 に答える 1

2

「minTime は 1 分で、minDistance は 300 メートルです。これらのパラメータを使用すると、1 分未満で 2 つの場所を取得することはできません...」

とにかく、JellyBean以前ではありません。

http://developer.android.com/reference/android/location/LocationManager.html

Jellybean より前は、minTime パラメーターは単なるヒントであり、一部のロケーション プロバイダーの実装では無視されていました。Jellybean 以降では、Android 互換デバイスで minTime パラメーターと minDistance パラメーターの両方を監視することが必須です。

JB の前は、特に GPS の受信状態が不安定な場合は、指定した最小時間よりも頻繁に更新を取得できます。詳細については、この回答を参照してください。

Android での requestLocationUpdates 間隔

于 2013-01-19T19:01:19.770 に答える