0

Samsung S3 および Android Google マップ V2 を使用します (「LocationClient」を使用して場所を取得します)。それを除いて完全に正常に機能します

  1. 屋内では、(LocationManager からの getLastLocation() ではなく) 更新された初めての場所は、更新されていなくても非常に非常に遅いです。(GPS オン、wifi オフ)

  2. 屋内で、WIFIをオンにします(ホットスポットに接続していなくても)、最初の位置更新速度は問題ありません.

私は以下のチュートリアルに従っており、屋外の場合、最初の位置更新 (LocationManager からの getLastLocation() ではない) の速度は問題ありません。

(Google チュートリアル) https://developers.google.com/maps/documentation/android/locationおよび http://developer.android.com/training/location/receive-location-updates.html


そして、ここのグーグルによれば、https://developers.google.com/maps/documentation/android/start、それは言った

android.permission.ACCESS_COARSE_LOCATION API が WiFi またはモバイル セル データ (またはその両方) を使用してデバイスの位置を特定できるようにします。

android.permission.ACCESS_FINE_LOCATION API が全地球測位システム (GPS) を使用して、デバイスの位置を非常に狭い範囲内で特定できるようにします。

したがって、ネットワークと GPS の両方から位置情報を更新する必要があると思います。

========================

しかし、私が得たのは

GPS のみをオンにすると、(LocationClient) は GPS 信号のみをリッスンするようです。また、NETWORK からの位置情報の更新が必要な場合は、WIFI もオンにする必要があります。

これは正しいです ?

ありがとう...

========================

アップデート

Google Maps Android API v2によると、新しい LocationSource を作成します。

現在、「LocationClient」は使用せず、別の「LocationSource」を Google マップに設定しています。Google マップは、屋内で Wi-Fi がオンになっていない場合でも、非常に迅速に更新された位置情報を受け取ることができます。

4

1 に答える 1

2

これは、あなたと同じ権限をすべて使用して、locationlistener に使用するものです。

private void startLocationListener() {

    userPosition.setPosition(myPosition);

    // Get the location manager
    locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

    locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            // Called when a new location is found by the network location provider.


            if(currLocation != null)
            {
                boolean better = isBetterLocation(location, currLocation);
                if(better)
                {

                    currLocation.set(location);
                    myPosition = new LatLng(currLocation.getLatitude(), currLocation.getLongitude());
                    userPosition.setPosition(myPosition);
                }
            }
            else
            {
                currLocation = location;
                myPosition = new LatLng(currLocation.getLatitude(), currLocation.getLongitude());
                userPosition.setPosition(myPosition);
            }

        }

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

        public void onProviderEnabled(String provider) {}

        public void onProviderDisabled(String provider) {}
    };


    locationManager.requestLocationUpdates(GPSPROVIDER, 5000, 0, locationListener);
    locationManager.requestLocationUpdates(NETPROVIDER, 30000, 0, locationListener);

}

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 > TIME;
    boolean isSignificantlyOlder = timeDelta < -TIME;
    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;
}
于 2013-08-10T02:33:13.537 に答える